From 82478c3559d0320b86b510537781ba4d188d3c56 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Mon, 12 Oct 2020 09:12:34 -0700 Subject: [PATCH 01/85] Revert "Revert "Add support for runtime field types to mappings editor. (#77420)" (#79611)" (#79940) This reverts commit e01d538e329f41c7f9e982b6285190521db019f9. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/application/app_context.tsx | 3 +- .../document_fields/field_parameters/index.ts | 4 + .../painless_script_parameter.tsx | 80 ++++++++++++++++ .../field_parameters/path_parameter.tsx | 22 ++--- .../runtime_type_parameter.tsx | 96 +++++++++++++++++++ .../term_vector_parameter.tsx | 15 +-- .../fields/create_field/create_field.tsx | 23 +++-- .../required_parameters_forms/index.ts | 4 +- .../runtime_type.tsx | 18 ++++ .../edit_field/edit_field_header_form.tsx | 66 ++++++++----- .../edit_field/field_description_section.tsx | 3 +- .../fields/field_beta_badge.tsx | 21 ++++ .../fields/field_types/index.ts | 2 + .../fields/field_types/runtime_type.tsx | 19 ++++ .../fields/fields_list_item.tsx | 7 +- .../search_fields/search_result_item.tsx | 4 +- .../constants/data_types_definition.tsx | 20 ++++ .../constants/field_options.tsx | 30 ++++++ .../constants/parameters_definition.tsx | 48 ++++++++++ .../components/mappings_editor/lib/index.ts | 22 ++++- .../mappings_editor/lib/utils.test.ts | 49 +++++++++- .../components/mappings_editor/lib/utils.ts | 19 +++- .../mappings_editor/shared_imports.ts | 2 + .../mappings_editor/types/document_fields.ts | 9 +- .../public/application/index.tsx | 33 ++++--- .../application/mount_management_section.ts | 2 + .../index_management/public/shared_imports.ts | 5 +- 27 files changed, 552 insertions(+), 74 deletions(-) create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/painless_script_parameter.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/runtime_type_parameter.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/runtime_type.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_beta_badge.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/runtime_type.tsx diff --git a/x-pack/plugins/index_management/public/application/app_context.tsx b/x-pack/plugins/index_management/public/application/app_context.tsx index 6fbe177d24e06..22e6f09907d75 100644 --- a/x-pack/plugins/index_management/public/application/app_context.tsx +++ b/x-pack/plugins/index_management/public/application/app_context.tsx @@ -8,7 +8,7 @@ import React, { createContext, useContext } from 'react'; import { ScopedHistory } from 'kibana/public'; import { ManagementAppMountParams } from 'src/plugins/management/public'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/public'; -import { CoreStart } from '../../../../../src/core/public'; +import { CoreSetup, CoreStart } from '../../../../../src/core/public'; import { IngestManagerSetup } from '../../../ingest_manager/public'; import { IndexMgmtMetricsType } from '../types'; @@ -34,6 +34,7 @@ export interface AppDependencies { }; history: ScopedHistory; setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; + uiSettings: CoreSetup['uiSettings']; } export const AppContextProvider = ({ diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/index.ts index b3bf071948956..c47ea4a884111 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/index.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/index.ts @@ -73,6 +73,10 @@ export * from './meta_parameter'; export * from './ignore_above_parameter'; +export { RuntimeTypeParameter } from './runtime_type_parameter'; + +export { PainlessScriptParameter } from './painless_script_parameter'; + export const PARAMETER_SERIALIZERS = [relationsSerializer, dynamicSerializer]; export const PARAMETER_DESERIALIZERS = [relationsDeserializer, dynamicDeserializer]; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/painless_script_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/painless_script_parameter.tsx new file mode 100644 index 0000000000000..19746034b530c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/painless_script_parameter.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiFormRow, EuiDescribedFormGroup } from '@elastic/eui'; + +import { CodeEditor, UseField } from '../../../shared_imports'; +import { getFieldConfig } from '../../../lib'; +import { EditFieldFormRow } from '../fields/edit_field'; + +interface Props { + stack?: boolean; +} + +export const PainlessScriptParameter = ({ stack }: Props) => { + return ( + + {(scriptField) => { + const error = scriptField.getErrorsMessages(); + const isInvalid = error ? Boolean(error.length) : false; + + const field = ( + + + + ); + + const fieldTitle = i18n.translate('xpack.idxMgmt.mappingsEditor.painlessScript.title', { + defaultMessage: 'Emitted value', + }); + + const fieldDescription = i18n.translate( + 'xpack.idxMgmt.mappingsEditor.painlessScript.description', + { + defaultMessage: 'Use emit() to define the value of this runtime field.', + } + ); + + if (stack) { + return ( + + {field} + + ); + } + + return ( + {fieldTitle}} + description={fieldDescription} + fullWidth={true} + > + {field} + + ); + }} + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx index 6575fe1fac7b8..62810df44b5af 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx @@ -93,17 +93,17 @@ export const PathParameter = ({ field, allFields }: Props) => { <> {!Boolean(suggestedFields.length) && ( <> - -

- {i18n.translate( - 'xpack.idxMgmt.mappingsEditor.aliasType.noFieldsAddedWarningMessage', - { - defaultMessage: - 'You need to add at least one field before creating an alias.', - } - )} -

-
+ )} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/runtime_type_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/runtime_type_parameter.tsx new file mode 100644 index 0000000000000..4bdb15af5e7d9 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/runtime_type_parameter.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiFormRow, + EuiComboBox, + EuiComboBoxOptionOption, + EuiDescribedFormGroup, + EuiSpacer, +} from '@elastic/eui'; + +import { UseField } from '../../../shared_imports'; +import { DataType } from '../../../types'; +import { getFieldConfig } from '../../../lib'; +import { RUNTIME_FIELD_OPTIONS, TYPE_DEFINITION } from '../../../constants'; +import { EditFieldFormRow, FieldDescriptionSection } from '../fields/edit_field'; + +interface Props { + stack?: boolean; +} + +export const RuntimeTypeParameter = ({ stack }: Props) => { + return ( + + {(runtimeTypeField) => { + const { label, value, setValue } = runtimeTypeField; + const typeDefinition = + TYPE_DEFINITION[(value as EuiComboBoxOptionOption[])[0]!.value as DataType]; + + const field = ( + <> + + + + + + + {/* Field description */} + {typeDefinition && ( + + {typeDefinition.description?.() as JSX.Element} + + )} + + ); + + const fieldTitle = i18n.translate('xpack.idxMgmt.mappingsEditor.runtimeType.title', { + defaultMessage: 'Emitted type', + }); + + const fieldDescription = i18n.translate( + 'xpack.idxMgmt.mappingsEditor.runtimeType.description', + { + defaultMessage: 'Select the type of value emitted by the runtime field.', + } + ); + + if (stack) { + return ( + + {field} + + ); + } + + return ( + {fieldTitle}} + description={fieldDescription} + fullWidth={true} + > + {field} + + ); + }} + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/term_vector_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/term_vector_parameter.tsx index 6752bb6d6af2b..69d56032eed6a 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/term_vector_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/term_vector_parameter.tsx @@ -56,14 +56,17 @@ export const TermVectorParameter = ({ field, defaultToggleValue }: Props) => { {formData.term_vector === 'with_positions_offsets' && ( <> - -

- {i18n.translate('xpack.idxMgmt.mappingsEditor.termVectorFieldWarningMessage', { + - + } + )} + /> )} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx index a8170b1d59fbb..cff2b9af4fd10 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx @@ -14,15 +14,17 @@ import { EuiFlexGroup, EuiFlexItem, EuiOutsideClickDetector, + EuiSpacer, } from '@elastic/eui'; import { useForm, Form, FormDataProvider } from '../../../../shared_imports'; -import { EUI_SIZE } from '../../../../constants'; +import { EUI_SIZE, TYPE_DEFINITION } from '../../../../constants'; import { useDispatch } from '../../../../mappings_state_context'; import { fieldSerializer } from '../../../../lib'; -import { Field, NormalizedFields } from '../../../../types'; +import { Field, NormalizedFields, MainType } from '../../../../types'; import { NameParameter, TypeParameter, SubTypeParameter } from '../../field_parameters'; -import { getParametersFormForType } from './required_parameters_forms'; +import { FieldBetaBadge } from '../field_beta_badge'; +import { getRequiredParametersFormForType } from './required_parameters_forms'; const formWrapper = (props: any) =>

; @@ -195,18 +197,27 @@ export const CreateField = React.memo(function CreateFieldComponent({ {({ type, subType }) => { - const ParametersForm = getParametersFormForType( + const RequiredParametersForm = getRequiredParametersFormForType( type?.[0].value, subType?.[0].value ); - if (!ParametersForm) { + if (!RequiredParametersForm) { return null; } + const typeDefinition = TYPE_DEFINITION[type?.[0].value as MainType]; + return (
- + {typeDefinition.isBeta ? ( + <> + + + + ) : null} + +
); }} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/index.ts index 1112bf99713ed..5c04b2fbb336c 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/index.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/index.ts @@ -11,6 +11,7 @@ import { AliasTypeRequiredParameters } from './alias_type'; import { TokenCountTypeRequiredParameters } from './token_count_type'; import { ScaledFloatTypeRequiredParameters } from './scaled_float_type'; import { DenseVectorRequiredParameters } from './dense_vector_type'; +import { RuntimeTypeRequiredParameters } from './runtime_type'; export interface ComponentProps { allFields: NormalizedFields['byId']; @@ -21,9 +22,10 @@ const typeToParametersFormMap: { [key in DataType]?: ComponentType } = { token_count: TokenCountTypeRequiredParameters, scaled_float: ScaledFloatTypeRequiredParameters, dense_vector: DenseVectorRequiredParameters, + runtime: RuntimeTypeRequiredParameters, }; -export const getParametersFormForType = ( +export const getRequiredParametersFormForType = ( type: MainType, subType?: SubType ): ComponentType | undefined => diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/runtime_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/runtime_type.tsx new file mode 100644 index 0000000000000..54907295f8a15 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/required_parameters_forms/runtime_type.tsx @@ -0,0 +1,18 @@ +/* + * 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 { RuntimeTypeParameter, PainlessScriptParameter } from '../../../field_parameters'; + +export const RuntimeTypeRequiredParameters = () => { + return ( + <> + + + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_header_form.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_header_form.tsx index 3b55c5ac076c2..e91a666cc4221 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_header_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_header_form.tsx @@ -5,12 +5,13 @@ */ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FormDataProvider } from '../../../../shared_imports'; -import { MainType, SubType, Field } from '../../../../types'; +import { MainType, SubType, Field, DataTypeDefinition } from '../../../../types'; import { TYPE_DEFINITION } from '../../../../constants'; import { NameParameter, TypeParameter, SubTypeParameter } from '../../field_parameters'; +import { FieldBetaBadge } from '../field_beta_badge'; import { FieldDescriptionSection } from './field_description_section'; interface Props { @@ -19,6 +20,25 @@ interface Props { isMultiField: boolean; } +const getTypeDefinition = (type: MainType, subType: SubType): DataTypeDefinition | undefined => { + if (!type) { + return; + } + + const typeDefinition = TYPE_DEFINITION[type]; + const hasSubType = typeDefinition.subTypes !== undefined; + + if (hasSubType) { + if (subType) { + return TYPE_DEFINITION[subType]; + } + + return; + } + + return typeDefinition; +}; + export const EditFieldHeaderForm = React.memo( ({ defaultValue, isRootLevelField, isMultiField }: Props) => { return ( @@ -56,27 +76,29 @@ export const EditFieldHeaderForm = React.memo( {/* Field description */} - - - {({ type, subType }) => { - if (!type) { - return null; - } - const typeDefinition = TYPE_DEFINITION[type[0].value as MainType]; - const hasSubType = typeDefinition.subTypes !== undefined; - - if (hasSubType) { - if (subType) { - const subTypeDefinition = TYPE_DEFINITION[subType as SubType]; - return (subTypeDefinition?.description?.() as JSX.Element) ?? null; - } - return null; - } + + {({ type, subType }) => { + const typeDefinition = getTypeDefinition( + type[0].value as MainType, + subType && (subType[0].value as SubType) + ); + const description = (typeDefinition?.description?.() as JSX.Element) ?? null; - return typeDefinition.description?.() as JSX.Element; - }} - - + return ( + <> + + + {typeDefinition?.isBeta && } + + + + + {description} + + + ); + }} +
); } diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/field_description_section.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/field_description_section.tsx index 2040d7f40d5cb..2301f7a47bf2f 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/field_description_section.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/field_description_section.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import React from 'react'; -import { EuiSpacer, EuiText } from '@elastic/eui'; +import { EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; interface Props { @@ -19,7 +19,6 @@ export const FieldDescriptionSection = ({ children, isMultiField }: Props) => { return (
- {children} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_beta_badge.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_beta_badge.tsx new file mode 100644 index 0000000000000..99c725e8a00b3 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_beta_badge.tsx @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiBetaBadge } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +export const FieldBetaBadge = () => { + const betaText = i18n.translate('xpack.idxMgmt.mappingsEditor.fieldBetaBadgeLabel', { + defaultMessage: 'Beta', + }); + + const tooltipText = i18n.translate('xpack.idxMgmt.mappingsEditor.fieldBetaBadgeTooltip', { + defaultMessage: 'This field type is not GA. Please help us by reporting any bugs.', + }); + + return ; +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts index 0f9308aa43448..d135d1b81419c 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/index.ts @@ -31,6 +31,7 @@ import { JoinType } from './join_type'; import { HistogramType } from './histogram_type'; import { ConstantKeywordType } from './constant_keyword_type'; import { RankFeatureType } from './rank_feature_type'; +import { RuntimeType } from './runtime_type'; import { WildcardType } from './wildcard_type'; import { PointType } from './point_type'; import { VersionType } from './version_type'; @@ -61,6 +62,7 @@ const typeToParametersFormMap: { [key in DataType]?: ComponentType } = { histogram: HistogramType, constant_keyword: ConstantKeywordType, rank_feature: RankFeatureType, + runtime: RuntimeType, wildcard: WildcardType, point: PointType, version: VersionType, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/runtime_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/runtime_type.tsx new file mode 100644 index 0000000000000..dcf5a74e0e304 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/runtime_type.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { RuntimeTypeParameter, PainlessScriptParameter } from '../../field_parameters'; +import { BasicParametersSection } from '../edit_field'; + +export const RuntimeType = () => { + return ( + + + + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx index 4ab0ea0fb355b..1939f09fa6762 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { NormalizedField, NormalizedFields } from '../../../types'; -import { getTypeLabelFromType } from '../../../lib'; +import { getTypeLabelFromField } from '../../../lib'; import { CHILD_FIELD_INDENT_SIZE, LEFT_PADDING_SIZE_FIELD_ITEM_WRAPPER } from '../../../constants'; import { FieldsList } from './fields_list'; @@ -67,6 +67,7 @@ function FieldListItemComponent( isExpanded, path, } = field; + // When there aren't any "child" fields (the maxNestedDepth === 0), there is no toggle icon on the left of any field. // For that reason, we need to compensate and substract some indent to left align on the page. const substractIndentAmount = maxNestedDepth === 0 ? CHILD_FIELD_INDENT_SIZE * 0.5 : 0; @@ -280,10 +281,10 @@ function FieldListItemComponent( ? i18n.translate('xpack.idxMgmt.mappingsEditor.multiFieldBadgeLabel', { defaultMessage: '{dataType} multi-field', values: { - dataType: getTypeLabelFromType(source.type), + dataType: getTypeLabelFromField(source), }, }) - : getTypeLabelFromType(source.type)} + : getTypeLabelFromField(source)} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx index a2d9a50f28394..a4cc4b4776e2b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { SearchResult } from '../../../types'; import { TYPE_DEFINITION } from '../../../constants'; import { useDispatch } from '../../../mappings_state_context'; -import { getTypeLabelFromType } from '../../../lib'; +import { getTypeLabelFromField } from '../../../lib'; import { DeleteFieldProvider } from '../fields/delete_field_provider'; interface Props { @@ -121,7 +121,7 @@ export const SearchResultItem = React.memo(function FieldListItemFlatComponent({ dataType: TYPE_DEFINITION[source.type].label, }, }) - : getTypeLabelFromType(source.type)} + : getTypeLabelFromField(source)} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx index 66be208fbb66b..07ca0a69afefb 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx @@ -13,6 +13,25 @@ import { documentationService } from '../../../services/documentation'; import { MainType, SubType, DataType, DataTypeDefinition } from '../types'; export const TYPE_DEFINITION: { [key in DataType]: DataTypeDefinition } = { + runtime: { + value: 'runtime', + isBeta: true, + label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.runtimeFieldDescription', { + defaultMessage: 'Runtime', + }), + // TODO: Add this once the page exists. + // documentation: { + // main: '/runtime_field.html', + // }, + description: () => ( +

+ +

+ ), + }, text: { value: 'text', label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.textDescription', { @@ -925,6 +944,7 @@ export const MAIN_TYPES: MainType[] = [ 'range', 'rank_feature', 'rank_features', + 'runtime', 'search_as_you_type', 'shape', 'text', diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/field_options.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/field_options.tsx index d16bf68b80e5d..25fdac5089b86 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/field_options.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/field_options.tsx @@ -18,6 +18,7 @@ export const TYPE_NOT_ALLOWED_MULTIFIELD: DataType[] = [ 'object', 'nested', 'alias', + 'runtime', ]; export const FIELD_TYPES_OPTIONS = Object.entries(MAIN_DATA_TYPE_DEFINITION).map( @@ -27,6 +28,35 @@ export const FIELD_TYPES_OPTIONS = Object.entries(MAIN_DATA_TYPE_DEFINITION).map }) ) as ComboBoxOption[]; +export const RUNTIME_FIELD_OPTIONS = [ + { + label: 'Keyword', + value: 'keyword', + }, + { + label: 'Long', + value: 'long', + }, + { + label: 'Double', + value: 'double', + }, + { + label: 'Date', + value: 'date', + }, + { + label: 'IP', + value: 'ip', + }, + { + label: 'Boolean', + value: 'boolean', + }, +] as ComboBoxOption[]; + +export const RUNTIME_FIELD_TYPES = ['keyword', 'long', 'double', 'date', 'ip', 'boolean'] as const; + interface SuperSelectOptionConfig { inputDisplay: string; dropdownDisplay: JSX.Element; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx index 281b14a25fcb6..1434b7d4b4429 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx @@ -20,6 +20,7 @@ import { import { AliasOption, DataType, + RuntimeType, ComboBoxOption, ParameterName, ParameterDefinition, @@ -27,6 +28,7 @@ import { import { documentationService } from '../../../services/documentation'; import { INDEX_DEFAULT } from './default_values'; import { TYPE_DEFINITION } from './data_types_definition'; +import { RUNTIME_FIELD_OPTIONS } from './field_options'; const { toInt } = fieldFormatters; const { emptyField, containsCharsField, numberGreaterThanField, isJsonField } = fieldValidators; @@ -185,6 +187,52 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, schema: t.string, }, + runtime_type: { + fieldConfig: { + type: FIELD_TYPES.COMBO_BOX, + label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.runtimeTypeLabel', { + defaultMessage: 'Type', + }), + defaultValue: 'keyword', + deserializer: (fieldType: RuntimeType | undefined) => { + if (typeof fieldType === 'string' && Boolean(fieldType)) { + const label = + RUNTIME_FIELD_OPTIONS.find(({ value }) => value === fieldType)?.label ?? fieldType; + return [ + { + label, + value: fieldType, + }, + ]; + } + return []; + }, + serializer: (value: ComboBoxOption[]) => (value.length === 0 ? '' : value[0].value), + }, + schema: t.string, + }, + script: { + fieldConfig: { + defaultValue: '', + type: FIELD_TYPES.TEXT, + label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.painlessScriptLabel', { + defaultMessage: 'Script', + }), + validations: [ + { + validator: emptyField( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.validations.scriptIsRequiredErrorMessage', + { + defaultMessage: 'Script must emit() a value.', + } + ) + ), + }, + ], + }, + schema: t.string, + }, store: { fieldConfig: { type: FIELD_TYPES.CHECKBOX, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/index.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/index.ts index 8cd1bbf0764ab..0a59cafdcef47 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/index.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/index.ts @@ -4,7 +4,27 @@ * you may not use this file except in compliance with the Elastic License. */ -export * from './utils'; +export { + getUniqueId, + getChildFieldsName, + getFieldMeta, + getTypeLabelFromField, + getFieldConfig, + getTypeMetaFromSource, + normalize, + deNormalize, + updateFieldsPathAfterFieldNameChange, + getAllChildFields, + getAllDescendantAliases, + getFieldAncestors, + filterTypesForMultiField, + filterTypesForNonRootFields, + getMaxNestedDepth, + buildFieldTreeFromIds, + shouldDeleteChildFieldsAfterTypeChange, + canUseMappingsEditor, + stripUndefinedValues, +} from './utils'; export * from './serializers'; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts index bc495b05e07b7..e1988c071314e 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts @@ -4,9 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('../constants', () => ({ MAIN_DATA_TYPE_DEFINITION: {} })); +jest.mock('../constants', () => { + const { TYPE_DEFINITION } = jest.requireActual('../constants'); + return { MAIN_DATA_TYPE_DEFINITION: {}, TYPE_DEFINITION }; +}); -import { stripUndefinedValues } from './utils'; +import { stripUndefinedValues, getTypeLabelFromField } from './utils'; describe('utils', () => { describe('stripUndefinedValues()', () => { @@ -53,4 +56,46 @@ describe('utils', () => { expect(stripUndefinedValues(dataIN)).toEqual(dataOUT); }); }); + + describe('getTypeLabelFromField()', () => { + test('returns an unprocessed label for non-runtime fields', () => { + expect( + getTypeLabelFromField({ + name: 'testField', + type: 'keyword', + }) + ).toBe('Keyword'); + }); + + test(`returns a label prepended with 'Other' for unrecognized fields`, () => { + expect( + getTypeLabelFromField({ + name: 'testField', + // @ts-ignore + type: 'hyperdrive', + }) + ).toBe('Other: hyperdrive'); + }); + + test("returns a label prepended with 'Runtime' for runtime fields", () => { + expect( + getTypeLabelFromField({ + name: 'testField', + type: 'runtime', + runtime_type: 'keyword', + }) + ).toBe('Runtime Keyword'); + }); + + test("returns a label prepended with 'Runtime Other' for unrecognized runtime fields", () => { + expect( + getTypeLabelFromField({ + name: 'testField', + type: 'runtime', + // @ts-ignore + runtime_type: 'hyperdrive', + }) + ).toBe('Runtime Other: hyperdrive'); + }); + }); }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts index cbbef8700783c..fd7aa41638505 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts @@ -71,8 +71,23 @@ export const getFieldMeta = (field: Field, isMultiField?: boolean): FieldMeta => }; }; -export const getTypeLabelFromType = (type: DataType) => - TYPE_DEFINITION[type] ? TYPE_DEFINITION[type].label : `${TYPE_DEFINITION.other.label}: ${type}`; +const getTypeLabel = (type?: DataType): string => { + return type && TYPE_DEFINITION[type] + ? TYPE_DEFINITION[type].label + : `${TYPE_DEFINITION.other.label}: ${type}`; +}; + +export const getTypeLabelFromField = (field: Field) => { + const { type, runtime_type: runtimeType } = field; + const typeLabel = getTypeLabel(type); + + if (type === 'runtime') { + const runtimeTypeLabel = getTypeLabel(runtimeType); + return `${typeLabel} ${runtimeTypeLabel}`; + } + + return typeLabel; +}; export const getFieldConfig = ( param: ParameterName, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/shared_imports.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/shared_imports.ts index 097d039527950..54b2486108183 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/shared_imports.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/shared_imports.ts @@ -51,3 +51,5 @@ export { OnJsonEditorUpdateHandler, GlobalFlyout, } from '../../../../../../../src/plugins/es_ui_shared/public'; + +export { CodeEditor } from '../../../../../../../src/plugins/kibana_react/public'; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts index b1d2915ebb1aa..ee4dd55a5801f 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts @@ -8,7 +8,7 @@ import { ReactNode } from 'react'; import { GenericObject } from './mappings_editor'; import { FieldConfig } from '../shared_imports'; -import { PARAMETERS_DEFINITION } from '../constants'; +import { PARAMETERS_DEFINITION, RUNTIME_FIELD_TYPES } from '../constants'; export interface DataTypeDefinition { label: string; @@ -19,6 +19,7 @@ export interface DataTypeDefinition { }; subTypes?: { label: string; types: SubType[] }; description?: () => ReactNode; + isBeta?: boolean; } export interface ParameterDefinition { @@ -35,6 +36,7 @@ export interface ParameterDefinition { } export type MainType = + | 'runtime' | 'text' | 'keyword' | 'numeric' @@ -74,6 +76,8 @@ export type SubType = NumericType | RangeType; export type DataType = MainType | SubType; +export type RuntimeType = typeof RUNTIME_FIELD_TYPES[number]; + export type NumericType = | 'long' | 'integer' @@ -152,6 +156,8 @@ export type ParameterName = | 'depth_limit' | 'relations' | 'max_shingle_size' + | 'runtime_type' + | 'script' | 'value' | 'meta'; @@ -169,6 +175,7 @@ export interface Fields { interface FieldBasic { name: string; type: DataType; + runtime_type?: DataType; subType?: SubType; properties?: { [key: string]: Omit }; fields?: { [key: string]: Omit }; diff --git a/x-pack/plugins/index_management/public/application/index.tsx b/x-pack/plugins/index_management/public/application/index.tsx index f881c2e01cefc..d8b5da8361c43 100644 --- a/x-pack/plugins/index_management/public/application/index.tsx +++ b/x-pack/plugins/index_management/public/application/index.tsx @@ -11,7 +11,7 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { CoreStart } from '../../../../../src/core/public'; import { API_BASE_PATH } from '../../common'; -import { GlobalFlyout } from '../shared_imports'; +import { createKibanaReactContext, GlobalFlyout } from '../shared_imports'; import { AppContextProvider, AppDependencies } from './app_context'; import { App } from './app'; @@ -30,7 +30,12 @@ export const renderApp = ( const { i18n, docLinks, notifications, application } = core; const { Context: I18nContext } = i18n; - const { services, history, setBreadcrumbs } = dependencies; + const { services, history, setBreadcrumbs, uiSettings } = dependencies; + + // uiSettings is required by the CodeEditor component used to edit runtime field Painless scripts. + const { Provider: KibanaReactContextProvider } = createKibanaReactContext({ + uiSettings, + }); const componentTemplateProviderValues = { httpClient: services.httpService.httpClient, @@ -44,17 +49,19 @@ export const renderApp = ( render( - - - - - - - - - - - + + + + + + + + + + + + + , elem ); diff --git a/x-pack/plugins/index_management/public/application/mount_management_section.ts b/x-pack/plugins/index_management/public/application/mount_management_section.ts index 6257b68430cf0..f7b728c875762 100644 --- a/x-pack/plugins/index_management/public/application/mount_management_section.ts +++ b/x-pack/plugins/index_management/public/application/mount_management_section.ts @@ -41,6 +41,7 @@ export async function mountManagementSection( fatalErrors, application, chrome: { docTitle }, + uiSettings, } = core; docTitle.change(PLUGIN.getI18nName(i18n)); @@ -60,6 +61,7 @@ export async function mountManagementSection( services, history, setBreadcrumbs, + uiSettings, }; const unmountAppCallback = renderApp(element, { core, dependencies: appDependencies }); diff --git a/x-pack/plugins/index_management/public/shared_imports.ts b/x-pack/plugins/index_management/public/shared_imports.ts index d58545768732e..acb3eb512e2c1 100644 --- a/x-pack/plugins/index_management/public/shared_imports.ts +++ b/x-pack/plugins/index_management/public/shared_imports.ts @@ -44,4 +44,7 @@ export { export { isJSON } from '../../../../src/plugins/es_ui_shared/static/validators/string'; -export { reactRouterNavigate } from '../../../../src/plugins/kibana_react/public'; +export { + createKibanaReactContext, + reactRouterNavigate, +} from '../../../../src/plugins/kibana_react/public'; From 1a3c0591b6c021631323ee763a422e890b68eb7a Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Mon, 12 Oct 2020 18:24:06 +0200 Subject: [PATCH 02/85] telemetry and reference extraction/injection for expression service (#72438) --- ...ins-expressions-public.executor.extract.md | 28 +++++++ ...gins-expressions-public.executor.inject.md | 23 ++++++ ...gin-plugins-expressions-public.executor.md | 5 +- ...s-expressions-public.executor.telemetry.md | 23 ++++++ ...ns-public.expressionastexpression.chain.md | 11 --- ...ressions-public.expressionastexpression.md | 15 ++-- ...ons-public.expressionastexpression.type.md | 11 --- ...-public.expressionastfunction.arguments.md | 11 --- ...ions-public.expressionastfunction.debug.md | 13 ---- ...s-public.expressionastfunction.function.md | 11 --- ...xpressions-public.expressionastfunction.md | 19 ++--- ...ons-public.expressionfunction.disabled.md} | 6 +- ...sions-public.expressionfunction.extract.md | 14 ++++ ...ssions-public.expressionfunction.inject.md | 11 +++ ...s-expressions-public.expressionfunction.md | 6 +- ...ons-public.expressionfunction.telemetry.md | 11 +++ ...c.expressionfunctiondefinition.disabled.md | 13 ++++ ...ons-public.expressionfunctiondefinition.md | 3 +- ...sions-public.expressionsservice.extract.md | 16 ++++ ...ssions-public.expressionsservice.inject.md | 13 ++++ ...s-expressions-public.expressionsservice.md | 5 +- ...ons-public.expressionsservice.telemetry.md | 13 ++++ ...expressions-public.expressionvalueerror.md | 10 +-- ...ibana-plugin-plugins-expressions-public.md | 4 +- ...ins-expressions-server.executor.extract.md | 28 +++++++ ...gins-expressions-server.executor.inject.md | 23 ++++++ ...gin-plugins-expressions-server.executor.md | 5 +- ...s-expressions-server.executor.telemetry.md | 23 ++++++ ...ns-server.expressionastexpression.chain.md | 11 --- ...ressions-server.expressionastexpression.md | 15 ++-- ...ons-server.expressionastexpression.type.md | 11 --- ...-server.expressionastfunction.arguments.md | 11 --- ...ions-server.expressionastfunction.debug.md | 13 ---- ...s-server.expressionastfunction.function.md | 11 --- ...xpressions-server.expressionastfunction.md | 19 ++--- ...ons-server.expressionfunction.disabled.md} | 6 +- ...sions-server.expressionfunction.extract.md | 14 ++++ ...ssions-server.expressionfunction.inject.md | 11 +++ ...s-expressions-server.expressionfunction.md | 6 +- ...ons-server.expressionfunction.telemetry.md | 11 +++ ...r.expressionfunctiondefinition.disabled.md | 13 ++++ ...ons-server.expressionfunctiondefinition.md | 3 +- ...expressions-server.expressionvalueerror.md | 10 +-- ...ibana-plugin-plugins-expressions-server.md | 4 +- src/plugins/expressions/.eslintrc.json | 5 ++ src/plugins/expressions/common/ast/types.ts | 12 +-- .../expressions/common/execution/execution.ts | 23 +++++- .../common/execution/execution_contract.ts | 2 +- .../common/executor/executor.test.ts | 45 ++++++++++- .../expressions/common/executor/executor.ts | 59 +++++++++++++- .../expression_function.ts | 38 ++++++++- .../common/expression_functions/types.ts | 9 ++- .../common/expression_types/specs/error.ts | 12 +-- .../common/service/expressions_services.ts | 34 +++++++- .../expressions/common/util/create_error.ts | 14 +++- src/plugins/expressions/public/public.api.md | 77 ++++++++++++------- src/plugins/expressions/server/server.api.md | 69 +++++++++++------ 57 files changed, 674 insertions(+), 268 deletions(-) create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.extract.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.inject.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.telemetry.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.chain.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.type.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.arguments.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.debug.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.function.md rename docs/development/plugins/expressions/public/{kibana-plugin-plugins-expressions-public.expressionastfunction.type.md => kibana-plugin-plugins-expressions-public.expressionfunction.disabled.md} (52%) create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.extract.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.inject.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.disabled.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.extract.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.inject.md create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.telemetry.md create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.extract.md create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.inject.md create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.telemetry.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.chain.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.type.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.arguments.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.debug.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.function.md rename docs/development/plugins/expressions/server/{kibana-plugin-plugins-expressions-server.expressionastfunction.type.md => kibana-plugin-plugins-expressions-server.expressionfunction.disabled.md} (52%) create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.extract.md create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.inject.md create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md create mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.disabled.md create mode 100644 src/plugins/expressions/.eslintrc.json diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.extract.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.extract.md new file mode 100644 index 0000000000000..6f30bd49013b0 --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.extract.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [Executor](./kibana-plugin-plugins-expressions-public.executor.md) > [extract](./kibana-plugin-plugins-expressions-public.executor.extract.md) + +## Executor.extract() method + +Signature: + +```typescript +extract(ast: ExpressionAstExpression): { + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ast | ExpressionAstExpression | | + +Returns: + +`{ + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }` + diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.inject.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.inject.md new file mode 100644 index 0000000000000..8f5a8a3e06724 --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.inject.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [Executor](./kibana-plugin-plugins-expressions-public.executor.md) > [inject](./kibana-plugin-plugins-expressions-public.executor.inject.md) + +## Executor.inject() method + +Signature: + +```typescript +inject(ast: ExpressionAstExpression, references: SavedObjectReference[]): ExpressionAstExpression; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ast | ExpressionAstExpression | | +| references | SavedObjectReference[] | | + +Returns: + +`ExpressionAstExpression` + diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md index b71c8c79c068f..2f96ad6e040bd 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.md @@ -7,7 +7,7 @@ Signature: ```typescript -export declare class Executor = Record> +export declare class Executor = Record> implements PersistableState ``` ## Constructors @@ -32,12 +32,15 @@ export declare class Executor = Recordstatic | | | [extendContext(extraContext)](./kibana-plugin-plugins-expressions-public.executor.extendcontext.md) | | | +| [extract(ast)](./kibana-plugin-plugins-expressions-public.executor.extract.md) | | | | [fork()](./kibana-plugin-plugins-expressions-public.executor.fork.md) | | | | [getFunction(name)](./kibana-plugin-plugins-expressions-public.executor.getfunction.md) | | | | [getFunctions()](./kibana-plugin-plugins-expressions-public.executor.getfunctions.md) | | | | [getType(name)](./kibana-plugin-plugins-expressions-public.executor.gettype.md) | | | | [getTypes()](./kibana-plugin-plugins-expressions-public.executor.gettypes.md) | | | +| [inject(ast, references)](./kibana-plugin-plugins-expressions-public.executor.inject.md) | | | | [registerFunction(functionDefinition)](./kibana-plugin-plugins-expressions-public.executor.registerfunction.md) | | | | [registerType(typeDefinition)](./kibana-plugin-plugins-expressions-public.executor.registertype.md) | | | | [run(ast, input, context)](./kibana-plugin-plugins-expressions-public.executor.run.md) | | Execute expression and return result. | +| [telemetry(ast, telemetryData)](./kibana-plugin-plugins-expressions-public.executor.telemetry.md) | | | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.telemetry.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.telemetry.md new file mode 100644 index 0000000000000..de4c640f4fe97 --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.telemetry.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [Executor](./kibana-plugin-plugins-expressions-public.executor.md) > [telemetry](./kibana-plugin-plugins-expressions-public.executor.telemetry.md) + +## Executor.telemetry() method + +Signature: + +```typescript +telemetry(ast: ExpressionAstExpression, telemetryData: Record): Record; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ast | ExpressionAstExpression | | +| telemetryData | Record<string, any> | | + +Returns: + +`Record` + diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.chain.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.chain.md deleted file mode 100644 index b50ac83036ffe..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.chain.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstExpression](./kibana-plugin-plugins-expressions-public.expressionastexpression.md) > [chain](./kibana-plugin-plugins-expressions-public.expressionastexpression.chain.md) - -## ExpressionAstExpression.chain property - -Signature: - -```typescript -chain: ExpressionAstFunction[]; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.md index 537659c51dce8..623c49bf08cdd 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.md @@ -2,18 +2,13 @@ [Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstExpression](./kibana-plugin-plugins-expressions-public.expressionastexpression.md) -## ExpressionAstExpression interface +## ExpressionAstExpression type Signature: ```typescript -export interface ExpressionAstExpression +export declare type ExpressionAstExpression = { + type: 'expression'; + chain: ExpressionAstFunction[]; +}; ``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [chain](./kibana-plugin-plugins-expressions-public.expressionastexpression.chain.md) | ExpressionAstFunction[] | | -| [type](./kibana-plugin-plugins-expressions-public.expressionastexpression.type.md) | 'expression' | | - diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.type.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.type.md deleted file mode 100644 index 34a86e235a911..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastexpression.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstExpression](./kibana-plugin-plugins-expressions-public.expressionastexpression.md) > [type](./kibana-plugin-plugins-expressions-public.expressionastexpression.type.md) - -## ExpressionAstExpression.type property - -Signature: - -```typescript -type: 'expression'; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.arguments.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.arguments.md deleted file mode 100644 index 72b44e8319542..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.arguments.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) > [arguments](./kibana-plugin-plugins-expressions-public.expressionastfunction.arguments.md) - -## ExpressionAstFunction.arguments property - -Signature: - -```typescript -arguments: Record; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.debug.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.debug.md deleted file mode 100644 index 36101a110979a..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.debug.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) > [debug](./kibana-plugin-plugins-expressions-public.expressionastfunction.debug.md) - -## ExpressionAstFunction.debug property - -Debug information added to each function when expression is executed in \*debug mode\*. - -Signature: - -```typescript -debug?: ExpressionAstFunctionDebug; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.function.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.function.md deleted file mode 100644 index 1840fff4b625f..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.function.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) > [function](./kibana-plugin-plugins-expressions-public.expressionastfunction.function.md) - -## ExpressionAstFunction.function property - -Signature: - -```typescript -function: string; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.md index 1004e58759806..d21f2c1750161 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.md @@ -2,20 +2,15 @@ [Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) -## ExpressionAstFunction interface +## ExpressionAstFunction type Signature: ```typescript -export interface ExpressionAstFunction +export declare type ExpressionAstFunction = { + type: 'function'; + function: string; + arguments: Record; + debug?: ExpressionAstFunctionDebug; +}; ``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [arguments](./kibana-plugin-plugins-expressions-public.expressionastfunction.arguments.md) | Record<string, ExpressionAstArgument[]> | | -| [debug](./kibana-plugin-plugins-expressions-public.expressionastfunction.debug.md) | ExpressionAstFunctionDebug | Debug information added to each function when expression is executed in \*debug mode\*. | -| [function](./kibana-plugin-plugins-expressions-public.expressionastfunction.function.md) | string | | -| [type](./kibana-plugin-plugins-expressions-public.expressionastfunction.type.md) | 'function' | | - diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.type.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.disabled.md similarity index 52% rename from docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.type.md rename to docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.disabled.md index f7f8786430191..f07d5b3b36d04 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionastfunction.type.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.disabled.md @@ -1,11 +1,11 @@ -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) > [type](./kibana-plugin-plugins-expressions-public.expressionastfunction.type.md) +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-public.expressionfunction.md) > [disabled](./kibana-plugin-plugins-expressions-public.expressionfunction.disabled.md) -## ExpressionAstFunction.type property +## ExpressionFunction.disabled property Signature: ```typescript -type: 'function'; +disabled: boolean; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.extract.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.extract.md new file mode 100644 index 0000000000000..c5d726849cdc2 --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.extract.md @@ -0,0 +1,14 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-public.expressionfunction.md) > [extract](./kibana-plugin-plugins-expressions-public.expressionfunction.extract.md) + +## ExpressionFunction.extract property + +Signature: + +```typescript +extract: (state: ExpressionAstFunction['arguments']) => { + state: ExpressionAstFunction['arguments']; + references: SavedObjectReference[]; + }; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.inject.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.inject.md new file mode 100644 index 0000000000000..6f27a6fbab96a --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.inject.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-public.expressionfunction.md) > [inject](./kibana-plugin-plugins-expressions-public.expressionfunction.inject.md) + +## ExpressionFunction.inject property + +Signature: + +```typescript +inject: (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments']; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md index 5ca67e40c93ec..1815d63d804b1 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.md @@ -7,7 +7,7 @@ Signature: ```typescript -export declare class ExpressionFunction +export declare class ExpressionFunction implements PersistableState ``` ## Constructors @@ -23,9 +23,13 @@ export declare class ExpressionFunction | [accepts](./kibana-plugin-plugins-expressions-public.expressionfunction.accepts.md) | | (type: string) => boolean | | | [aliases](./kibana-plugin-plugins-expressions-public.expressionfunction.aliases.md) | | string[] | Aliases that can be used instead of name. | | [args](./kibana-plugin-plugins-expressions-public.expressionfunction.args.md) | | Record<string, ExpressionFunctionParameter> | Specification of expression function parameters. | +| [disabled](./kibana-plugin-plugins-expressions-public.expressionfunction.disabled.md) | | boolean | | +| [extract](./kibana-plugin-plugins-expressions-public.expressionfunction.extract.md) | | (state: ExpressionAstFunction['arguments']) => {
state: ExpressionAstFunction['arguments'];
references: SavedObjectReference[];
} | | | [fn](./kibana-plugin-plugins-expressions-public.expressionfunction.fn.md) | | (input: ExpressionValue, params: Record<string, any>, handlers: object) => ExpressionValue | Function to run function (context, args) | | [help](./kibana-plugin-plugins-expressions-public.expressionfunction.help.md) | | string | A short help text. | +| [inject](./kibana-plugin-plugins-expressions-public.expressionfunction.inject.md) | | (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments'] | | | [inputTypes](./kibana-plugin-plugins-expressions-public.expressionfunction.inputtypes.md) | | string[] | undefined | Type of inputs that this function supports. | | [name](./kibana-plugin-plugins-expressions-public.expressionfunction.name.md) | | string | Name of function | +| [telemetry](./kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md) | | (state: ExpressionAstFunction['arguments'], telemetryData: Record<string, any>) => Record<string, any> | | | [type](./kibana-plugin-plugins-expressions-public.expressionfunction.type.md) | | string | Return type of function. This SHOULD be supplied. We use it for UI and autocomplete hinting. We may also use it for optimizations in the future. | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md new file mode 100644 index 0000000000000..249c99f50fc7b --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-public.expressionfunction.md) > [telemetry](./kibana-plugin-plugins-expressions-public.expressionfunction.telemetry.md) + +## ExpressionFunction.telemetry property + +Signature: + +```typescript +telemetry: (state: ExpressionAstFunction['arguments'], telemetryData: Record) => Record; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.disabled.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.disabled.md new file mode 100644 index 0000000000000..e6aefd17fceb2 --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.disabled.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionFunctionDefinition](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md) > [disabled](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.disabled.md) + +## ExpressionFunctionDefinition.disabled property + +if set to true function will be disabled (but its migrate function will still be available) + +Signature: + +```typescript +disabled?: boolean; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md index bc801542f81ac..449cc66cb3335 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md @@ -9,7 +9,7 @@ Signature: ```typescript -export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> +export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> extends PersistableStateDefinition ``` ## Properties @@ -19,6 +19,7 @@ export interface ExpressionFunctionDefinitionstring[] | What is this? | | [args](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.args.md) | {
[key in keyof Arguments]: ArgumentType<Arguments[key]>;
} | Specification of arguments that function supports. This list will also be used for autocomplete functionality when your function is being edited. | | [context](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.context.md) | {
types: AnyExpressionFunctionDefinition['inputTypes'];
} | | +| [disabled](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.disabled.md) | boolean | if set to true function will be disabled (but its migrate function will still be available) | | [help](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.help.md) | string | Help text displayed in the Expression editor. This text should be internationalized. | | [inputTypes](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.inputtypes.md) | Array<TypeToString<Input>> | List of allowed type names for input value of this function. If this property is set the input of function will be cast to the first possible type in this list. If this property is missing the input will be provided to the function as-is. | | [name](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.name.md) | Name | The name of the function, as will be used in expression. | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.extract.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.extract.md new file mode 100644 index 0000000000000..90f1f59c90dea --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.extract.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionsService](./kibana-plugin-plugins-expressions-public.expressionsservice.md) > [extract](./kibana-plugin-plugins-expressions-public.expressionsservice.extract.md) + +## ExpressionsService.extract property + +Extracts saved object references from expression AST + +Signature: + +```typescript +readonly extract: (state: ExpressionAstExpression) => { + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.inject.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.inject.md new file mode 100644 index 0000000000000..8ccc673ef24db --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.inject.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionsService](./kibana-plugin-plugins-expressions-public.expressionsservice.md) > [inject](./kibana-plugin-plugins-expressions-public.expressionsservice.inject.md) + +## ExpressionsService.inject property + +Injects saved object references into expression AST + +Signature: + +```typescript +readonly inject: (state: ExpressionAstExpression, references: SavedObjectReference[]) => ExpressionAstExpression; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md index fa93435bffc38..041d66b22dd50 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.md @@ -15,7 +15,7 @@ so that JSDoc appears in developers IDE when they use those `plugins.expressions Signature: ```typescript -export declare class ExpressionsService +export declare class ExpressionsService implements PersistableState ``` ## Constructors @@ -30,6 +30,7 @@ export declare class ExpressionsService | --- | --- | --- | --- | | [execute](./kibana-plugin-plugins-expressions-public.expressionsservice.execute.md) | | ExpressionsServiceStart['execute'] | | | [executor](./kibana-plugin-plugins-expressions-public.expressionsservice.executor.md) | | Executor | | +| [extract](./kibana-plugin-plugins-expressions-public.expressionsservice.extract.md) | | (state: ExpressionAstExpression) => {
state: ExpressionAstExpression;
references: SavedObjectReference[];
} | Extracts saved object references from expression AST | | [fork](./kibana-plugin-plugins-expressions-public.expressionsservice.fork.md) | | () => ExpressionsService | | | [getFunction](./kibana-plugin-plugins-expressions-public.expressionsservice.getfunction.md) | | ExpressionsServiceStart['getFunction'] | | | [getFunctions](./kibana-plugin-plugins-expressions-public.expressionsservice.getfunctions.md) | | () => ReturnType<Executor['getFunctions']> | Returns POJO map of all registered expression functions, where keys are names of the functions and values are ExpressionFunction instances. | @@ -37,6 +38,7 @@ export declare class ExpressionsService | [getRenderers](./kibana-plugin-plugins-expressions-public.expressionsservice.getrenderers.md) | | () => ReturnType<ExpressionRendererRegistry['toJS']> | Returns POJO map of all registered expression renderers, where keys are names of the renderers and values are ExpressionRenderer instances. | | [getType](./kibana-plugin-plugins-expressions-public.expressionsservice.gettype.md) | | ExpressionsServiceStart['getType'] | | | [getTypes](./kibana-plugin-plugins-expressions-public.expressionsservice.gettypes.md) | | () => ReturnType<Executor['getTypes']> | Returns POJO map of all registered expression types, where keys are names of the types and values are ExpressionType instances. | +| [inject](./kibana-plugin-plugins-expressions-public.expressionsservice.inject.md) | | (state: ExpressionAstExpression, references: SavedObjectReference[]) => ExpressionAstExpression | Injects saved object references into expression AST | | [registerFunction](./kibana-plugin-plugins-expressions-public.expressionsservice.registerfunction.md) | | (functionDefinition: AnyExpressionFunctionDefinition | (() => AnyExpressionFunctionDefinition)) => void | Register an expression function, which will be possible to execute as part of the expression pipeline.Below we register a function which simply sleeps for given number of milliseconds to delay the execution and outputs its input as-is. ```ts expressions.registerFunction({ @@ -61,6 +63,7 @@ The actual function is defined in the fn key. The function can be \ | [registerType](./kibana-plugin-plugins-expressions-public.expressionsservice.registertype.md) | | (typeDefinition: AnyExpressionTypeDefinition | (() => AnyExpressionTypeDefinition)) => void | | | [renderers](./kibana-plugin-plugins-expressions-public.expressionsservice.renderers.md) | | ExpressionRendererRegistry | | | [run](./kibana-plugin-plugins-expressions-public.expressionsservice.run.md) | | ExpressionsServiceStart['run'] | | +| [telemetry](./kibana-plugin-plugins-expressions-public.expressionsservice.telemetry.md) | | (state: ExpressionAstExpression, telemetryData?: Record<string, any>) => Record<string, any> | Extracts telemetry from expression AST | ## Methods diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.telemetry.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.telemetry.md new file mode 100644 index 0000000000000..5f28eb732e389 --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservice.telemetry.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionsService](./kibana-plugin-plugins-expressions-public.expressionsservice.md) > [telemetry](./kibana-plugin-plugins-expressions-public.expressionsservice.telemetry.md) + +## ExpressionsService.telemetry property + +Extracts telemetry from expression AST + +Signature: + +```typescript +readonly telemetry: (state: ExpressionAstExpression, telemetryData?: Record) => Record; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionvalueerror.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionvalueerror.md index 4a714fe62424f..1dee4a139c660 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionvalueerror.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionvalueerror.md @@ -8,13 +8,7 @@ ```typescript export declare type ExpressionValueError = ExpressionValueBoxed<'error', { - error: { - message: string; - type?: string; - name?: string; - stack?: string; - original?: Error; - }; - info?: unknown; + error: ErrorLike; + info?: SerializableState; }>; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md index ead6f14e0d1d7..b0c732188a46e 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md @@ -55,9 +55,7 @@ | [ExecutionParams](./kibana-plugin-plugins-expressions-public.executionparams.md) | | | [ExecutionState](./kibana-plugin-plugins-expressions-public.executionstate.md) | | | [ExecutorState](./kibana-plugin-plugins-expressions-public.executorstate.md) | | -| [ExpressionAstExpression](./kibana-plugin-plugins-expressions-public.expressionastexpression.md) | | | [ExpressionAstExpressionBuilder](./kibana-plugin-plugins-expressions-public.expressionastexpressionbuilder.md) | | -| [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) | | | [ExpressionAstFunctionBuilder](./kibana-plugin-plugins-expressions-public.expressionastfunctionbuilder.md) | | | [ExpressionExecutor](./kibana-plugin-plugins-expressions-public.expressionexecutor.md) | | | [ExpressionFunctionDefinition](./kibana-plugin-plugins-expressions-public.expressionfunctiondefinition.md) | ExpressionFunctionDefinition is the interface plugins have to implement to register a function in expressions plugin. | @@ -102,6 +100,8 @@ | [ExecutionContainer](./kibana-plugin-plugins-expressions-public.executioncontainer.md) | | | [ExecutorContainer](./kibana-plugin-plugins-expressions-public.executorcontainer.md) | | | [ExpressionAstArgument](./kibana-plugin-plugins-expressions-public.expressionastargument.md) | | +| [ExpressionAstExpression](./kibana-plugin-plugins-expressions-public.expressionastexpression.md) | | +| [ExpressionAstFunction](./kibana-plugin-plugins-expressions-public.expressionastfunction.md) | | | [ExpressionAstNode](./kibana-plugin-plugins-expressions-public.expressionastnode.md) | | | [ExpressionFunctionKibana](./kibana-plugin-plugins-expressions-public.expressionfunctionkibana.md) | | | [ExpressionRendererComponent](./kibana-plugin-plugins-expressions-public.expressionrenderercomponent.md) | | diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.extract.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.extract.md new file mode 100644 index 0000000000000..0829824732e74 --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.extract.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [Executor](./kibana-plugin-plugins-expressions-server.executor.md) > [extract](./kibana-plugin-plugins-expressions-server.executor.extract.md) + +## Executor.extract() method + +Signature: + +```typescript +extract(ast: ExpressionAstExpression): { + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ast | ExpressionAstExpression | | + +Returns: + +`{ + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }` + diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.inject.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.inject.md new file mode 100644 index 0000000000000..bbc5f7a3cece7 --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.inject.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [Executor](./kibana-plugin-plugins-expressions-server.executor.md) > [inject](./kibana-plugin-plugins-expressions-server.executor.inject.md) + +## Executor.inject() method + +Signature: + +```typescript +inject(ast: ExpressionAstExpression, references: SavedObjectReference[]): ExpressionAstExpression; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ast | ExpressionAstExpression | | +| references | SavedObjectReference[] | | + +Returns: + +`ExpressionAstExpression` + diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md index 7e6bb8c7ded5e..ec4e0bdcc4569 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.md @@ -7,7 +7,7 @@ Signature: ```typescript -export declare class Executor = Record> +export declare class Executor = Record> implements PersistableState ``` ## Constructors @@ -32,12 +32,15 @@ export declare class Executor = Recordstatic | | | [extendContext(extraContext)](./kibana-plugin-plugins-expressions-server.executor.extendcontext.md) | | | +| [extract(ast)](./kibana-plugin-plugins-expressions-server.executor.extract.md) | | | | [fork()](./kibana-plugin-plugins-expressions-server.executor.fork.md) | | | | [getFunction(name)](./kibana-plugin-plugins-expressions-server.executor.getfunction.md) | | | | [getFunctions()](./kibana-plugin-plugins-expressions-server.executor.getfunctions.md) | | | | [getType(name)](./kibana-plugin-plugins-expressions-server.executor.gettype.md) | | | | [getTypes()](./kibana-plugin-plugins-expressions-server.executor.gettypes.md) | | | +| [inject(ast, references)](./kibana-plugin-plugins-expressions-server.executor.inject.md) | | | | [registerFunction(functionDefinition)](./kibana-plugin-plugins-expressions-server.executor.registerfunction.md) | | | | [registerType(typeDefinition)](./kibana-plugin-plugins-expressions-server.executor.registertype.md) | | | | [run(ast, input, context)](./kibana-plugin-plugins-expressions-server.executor.run.md) | | Execute expression and return result. | +| [telemetry(ast, telemetryData)](./kibana-plugin-plugins-expressions-server.executor.telemetry.md) | | | diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.telemetry.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.telemetry.md new file mode 100644 index 0000000000000..68100c38cfa5b --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.telemetry.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [Executor](./kibana-plugin-plugins-expressions-server.executor.md) > [telemetry](./kibana-plugin-plugins-expressions-server.executor.telemetry.md) + +## Executor.telemetry() method + +Signature: + +```typescript +telemetry(ast: ExpressionAstExpression, telemetryData: Record): Record; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| ast | ExpressionAstExpression | | +| telemetryData | Record<string, any> | | + +Returns: + +`Record` + diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.chain.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.chain.md deleted file mode 100644 index cc8006b918dec..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.chain.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstExpression](./kibana-plugin-plugins-expressions-server.expressionastexpression.md) > [chain](./kibana-plugin-plugins-expressions-server.expressionastexpression.chain.md) - -## ExpressionAstExpression.chain property - -Signature: - -```typescript -chain: ExpressionAstFunction[]; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.md index b5f83d1af7cb7..9606cb9e36960 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.md @@ -2,18 +2,13 @@ [Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstExpression](./kibana-plugin-plugins-expressions-server.expressionastexpression.md) -## ExpressionAstExpression interface +## ExpressionAstExpression type Signature: ```typescript -export interface ExpressionAstExpression +export declare type ExpressionAstExpression = { + type: 'expression'; + chain: ExpressionAstFunction[]; +}; ``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [chain](./kibana-plugin-plugins-expressions-server.expressionastexpression.chain.md) | ExpressionAstFunction[] | | -| [type](./kibana-plugin-plugins-expressions-server.expressionastexpression.type.md) | 'expression' | | - diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.type.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.type.md deleted file mode 100644 index 46cd60cecaa84..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastexpression.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstExpression](./kibana-plugin-plugins-expressions-server.expressionastexpression.md) > [type](./kibana-plugin-plugins-expressions-server.expressionastexpression.type.md) - -## ExpressionAstExpression.type property - -Signature: - -```typescript -type: 'expression'; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.arguments.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.arguments.md deleted file mode 100644 index 052cadffb9bdb..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.arguments.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) > [arguments](./kibana-plugin-plugins-expressions-server.expressionastfunction.arguments.md) - -## ExpressionAstFunction.arguments property - -Signature: - -```typescript -arguments: Record; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.debug.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.debug.md deleted file mode 100644 index b3227c2ac5822..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.debug.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) > [debug](./kibana-plugin-plugins-expressions-server.expressionastfunction.debug.md) - -## ExpressionAstFunction.debug property - -Debug information added to each function when expression is executed in \*debug mode\*. - -Signature: - -```typescript -debug?: ExpressionAstFunctionDebug; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.function.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.function.md deleted file mode 100644 index 9964409f49119..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.function.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) > [function](./kibana-plugin-plugins-expressions-server.expressionastfunction.function.md) - -## ExpressionAstFunction.function property - -Signature: - -```typescript -function: string; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.md index 1d49de44b571d..7fbcf2dcfd141 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.md @@ -2,20 +2,15 @@ [Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) -## ExpressionAstFunction interface +## ExpressionAstFunction type Signature: ```typescript -export interface ExpressionAstFunction +export declare type ExpressionAstFunction = { + type: 'function'; + function: string; + arguments: Record; + debug?: ExpressionAstFunctionDebug; +}; ``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [arguments](./kibana-plugin-plugins-expressions-server.expressionastfunction.arguments.md) | Record<string, ExpressionAstArgument[]> | | -| [debug](./kibana-plugin-plugins-expressions-server.expressionastfunction.debug.md) | ExpressionAstFunctionDebug | Debug information added to each function when expression is executed in \*debug mode\*. | -| [function](./kibana-plugin-plugins-expressions-server.expressionastfunction.function.md) | string | | -| [type](./kibana-plugin-plugins-expressions-server.expressionastfunction.type.md) | 'function' | | - diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.type.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.disabled.md similarity index 52% rename from docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.type.md rename to docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.disabled.md index 3fd10524c1599..8ae51645f5df9 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionastfunction.type.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.disabled.md @@ -1,11 +1,11 @@ -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) > [type](./kibana-plugin-plugins-expressions-server.expressionastfunction.type.md) +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-server.expressionfunction.md) > [disabled](./kibana-plugin-plugins-expressions-server.expressionfunction.disabled.md) -## ExpressionAstFunction.type property +## ExpressionFunction.disabled property Signature: ```typescript -type: 'function'; +disabled: boolean; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.extract.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.extract.md new file mode 100644 index 0000000000000..e7ecad4a6c9e4 --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.extract.md @@ -0,0 +1,14 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-server.expressionfunction.md) > [extract](./kibana-plugin-plugins-expressions-server.expressionfunction.extract.md) + +## ExpressionFunction.extract property + +Signature: + +```typescript +extract: (state: ExpressionAstFunction['arguments']) => { + state: ExpressionAstFunction['arguments']; + references: SavedObjectReference[]; + }; +``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.inject.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.inject.md new file mode 100644 index 0000000000000..85c98ef9193da --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.inject.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-server.expressionfunction.md) > [inject](./kibana-plugin-plugins-expressions-server.expressionfunction.inject.md) + +## ExpressionFunction.inject property + +Signature: + +```typescript +inject: (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments']; +``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md index aac3878b8c859..7fcda94968d13 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.md @@ -7,7 +7,7 @@ Signature: ```typescript -export declare class ExpressionFunction +export declare class ExpressionFunction implements PersistableState ``` ## Constructors @@ -23,9 +23,13 @@ export declare class ExpressionFunction | [accepts](./kibana-plugin-plugins-expressions-server.expressionfunction.accepts.md) | | (type: string) => boolean | | | [aliases](./kibana-plugin-plugins-expressions-server.expressionfunction.aliases.md) | | string[] | Aliases that can be used instead of name. | | [args](./kibana-plugin-plugins-expressions-server.expressionfunction.args.md) | | Record<string, ExpressionFunctionParameter> | Specification of expression function parameters. | +| [disabled](./kibana-plugin-plugins-expressions-server.expressionfunction.disabled.md) | | boolean | | +| [extract](./kibana-plugin-plugins-expressions-server.expressionfunction.extract.md) | | (state: ExpressionAstFunction['arguments']) => {
state: ExpressionAstFunction['arguments'];
references: SavedObjectReference[];
} | | | [fn](./kibana-plugin-plugins-expressions-server.expressionfunction.fn.md) | | (input: ExpressionValue, params: Record<string, any>, handlers: object) => ExpressionValue | Function to run function (context, args) | | [help](./kibana-plugin-plugins-expressions-server.expressionfunction.help.md) | | string | A short help text. | +| [inject](./kibana-plugin-plugins-expressions-server.expressionfunction.inject.md) | | (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments'] | | | [inputTypes](./kibana-plugin-plugins-expressions-server.expressionfunction.inputtypes.md) | | string[] | undefined | Type of inputs that this function supports. | | [name](./kibana-plugin-plugins-expressions-server.expressionfunction.name.md) | | string | Name of function | +| [telemetry](./kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md) | | (state: ExpressionAstFunction['arguments'], telemetryData: Record<string, any>) => Record<string, any> | | | [type](./kibana-plugin-plugins-expressions-server.expressionfunction.type.md) | | string | Return type of function. This SHOULD be supplied. We use it for UI and autocomplete hinting. We may also use it for optimizations in the future. | diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md new file mode 100644 index 0000000000000..2894486847b27 --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunction](./kibana-plugin-plugins-expressions-server.expressionfunction.md) > [telemetry](./kibana-plugin-plugins-expressions-server.expressionfunction.telemetry.md) + +## ExpressionFunction.telemetry property + +Signature: + +```typescript +telemetry: (state: ExpressionAstFunction['arguments'], telemetryData: Record) => Record; +``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.disabled.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.disabled.md new file mode 100644 index 0000000000000..88456c8700aec --- /dev/null +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.disabled.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExpressionFunctionDefinition](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.md) > [disabled](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.disabled.md) + +## ExpressionFunctionDefinition.disabled property + +if set to true function will be disabled (but its migrate function will still be available) + +Signature: + +```typescript +disabled?: boolean; +``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.md index 6463c6ac537b9..51240f094b181 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.md @@ -9,7 +9,7 @@ Signature: ```typescript -export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> +export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> extends PersistableStateDefinition ``` ## Properties @@ -19,6 +19,7 @@ export interface ExpressionFunctionDefinitionstring[] | What is this? | | [args](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.args.md) | {
[key in keyof Arguments]: ArgumentType<Arguments[key]>;
} | Specification of arguments that function supports. This list will also be used for autocomplete functionality when your function is being edited. | | [context](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.context.md) | {
types: AnyExpressionFunctionDefinition['inputTypes'];
} | | +| [disabled](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.disabled.md) | boolean | if set to true function will be disabled (but its migrate function will still be available) | | [help](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.help.md) | string | Help text displayed in the Expression editor. This text should be internationalized. | | [inputTypes](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.inputtypes.md) | Array<TypeToString<Input>> | List of allowed type names for input value of this function. If this property is set the input of function will be cast to the first possible type in this list. If this property is missing the input will be provided to the function as-is. | | [name](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.name.md) | Name | The name of the function, as will be used in expression. | diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionvalueerror.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionvalueerror.md index b90e4360e055a..c8132948a8993 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionvalueerror.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.expressionvalueerror.md @@ -8,13 +8,7 @@ ```typescript export declare type ExpressionValueError = ExpressionValueBoxed<'error', { - error: { - message: string; - type?: string; - name?: string; - stack?: string; - original?: Error; - }; - info?: unknown; + error: ErrorLike; + info?: SerializableState; }>; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md index c9fed2e00c66c..dd7c7af466bd0 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md @@ -52,9 +52,7 @@ | [ExecutionParams](./kibana-plugin-plugins-expressions-server.executionparams.md) | | | [ExecutionState](./kibana-plugin-plugins-expressions-server.executionstate.md) | | | [ExecutorState](./kibana-plugin-plugins-expressions-server.executorstate.md) | | -| [ExpressionAstExpression](./kibana-plugin-plugins-expressions-server.expressionastexpression.md) | | | [ExpressionAstExpressionBuilder](./kibana-plugin-plugins-expressions-server.expressionastexpressionbuilder.md) | | -| [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) | | | [ExpressionAstFunctionBuilder](./kibana-plugin-plugins-expressions-server.expressionastfunctionbuilder.md) | | | [ExpressionFunctionDefinition](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinition.md) | ExpressionFunctionDefinition is the interface plugins have to implement to register a function in expressions plugin. | | [ExpressionFunctionDefinitions](./kibana-plugin-plugins-expressions-server.expressionfunctiondefinitions.md) | A mapping of ExpressionFunctionDefinitions for functions which the Expressions services provides out-of-the-box. Any new functions registered by the Expressions plugin should have their types added here. | @@ -86,6 +84,8 @@ | [ExecutionContainer](./kibana-plugin-plugins-expressions-server.executioncontainer.md) | | | [ExecutorContainer](./kibana-plugin-plugins-expressions-server.executorcontainer.md) | | | [ExpressionAstArgument](./kibana-plugin-plugins-expressions-server.expressionastargument.md) | | +| [ExpressionAstExpression](./kibana-plugin-plugins-expressions-server.expressionastexpression.md) | | +| [ExpressionAstFunction](./kibana-plugin-plugins-expressions-server.expressionastfunction.md) | | | [ExpressionAstNode](./kibana-plugin-plugins-expressions-server.expressionastnode.md) | | | [ExpressionFunctionKibana](./kibana-plugin-plugins-expressions-server.expressionfunctionkibana.md) | | | [ExpressionsServerSetup](./kibana-plugin-plugins-expressions-server.expressionsserversetup.md) | | diff --git a/src/plugins/expressions/.eslintrc.json b/src/plugins/expressions/.eslintrc.json new file mode 100644 index 0000000000000..2aab6c2d9093b --- /dev/null +++ b/src/plugins/expressions/.eslintrc.json @@ -0,0 +1,5 @@ +{ + "rules": { + "@typescript-eslint/consistent-type-definitions": 0 + } +} diff --git a/src/plugins/expressions/common/ast/types.ts b/src/plugins/expressions/common/ast/types.ts index 09fb4fae3f201..e8cf497774569 100644 --- a/src/plugins/expressions/common/ast/types.ts +++ b/src/plugins/expressions/common/ast/types.ts @@ -24,12 +24,12 @@ export type ExpressionAstNode = | ExpressionAstFunction | ExpressionAstArgument; -export interface ExpressionAstExpression { +export type ExpressionAstExpression = { type: 'expression'; chain: ExpressionAstFunction[]; -} +}; -export interface ExpressionAstFunction { +export type ExpressionAstFunction = { type: 'function'; function: string; arguments: Record; @@ -38,9 +38,9 @@ export interface ExpressionAstFunction { * Debug information added to each function when expression is executed in *debug mode*. */ debug?: ExpressionAstFunctionDebug; -} +}; -export interface ExpressionAstFunctionDebug { +export type ExpressionAstFunctionDebug = { /** * True if function successfully returned output, false if function threw. */ @@ -83,6 +83,6 @@ export interface ExpressionAstFunctionDebug { * timing starts after the arguments have been resolved. */ duration: number | undefined; -} +}; export type ExpressionAstArgument = string | boolean | number | ExpressionAstExpression; diff --git a/src/plugins/expressions/common/execution/execution.ts b/src/plugins/expressions/common/execution/execution.ts index d4c9b0a25d45b..69140453f486d 100644 --- a/src/plugins/expressions/common/execution/execution.ts +++ b/src/plugins/expressions/common/execution/execution.ts @@ -17,6 +17,7 @@ * under the License. */ +import { i18n } from '@kbn/i18n'; import { keys, last, mapValues, reduce, zipObject } from 'lodash'; import { Executor, ExpressionExecOptions } from '../executor'; import { createExecutionContainer, ExecutionContainer } from './container'; @@ -217,7 +218,27 @@ export class Execution< const fn = getByAlias(this.state.get().functions, fnName); if (!fn) { - return createError({ message: `Function ${fnName} could not be found.` }); + return createError({ + name: 'fn not found', + message: i18n.translate('expressions.execution.functionNotFound', { + defaultMessage: `Function {fnName} could not be found.`, + values: { + fnName, + }, + }), + }); + } + + if (fn.disabled) { + return createError({ + name: 'fn is disabled', + message: i18n.translate('expressions.execution.functionDisabled', { + defaultMessage: `Function {fnName} is disabled.`, + values: { + fnName, + }, + }), + }); } let args: Record = {}; diff --git a/src/plugins/expressions/common/execution/execution_contract.ts b/src/plugins/expressions/common/execution/execution_contract.ts index 20c5b2dd434b5..79bb4c58ab48d 100644 --- a/src/plugins/expressions/common/execution/execution_contract.ts +++ b/src/plugins/expressions/common/execution/execution_contract.ts @@ -62,7 +62,7 @@ export class ExecutionContract< return { type: 'error', error: { - type: e.type, + name: e.name, message: e.message, stack: e.stack, }, diff --git a/src/plugins/expressions/common/executor/executor.test.ts b/src/plugins/expressions/common/executor/executor.test.ts index 81845401d32e4..a658d3457407c 100644 --- a/src/plugins/expressions/common/executor/executor.test.ts +++ b/src/plugins/expressions/common/executor/executor.test.ts @@ -21,7 +21,7 @@ import { Executor } from './executor'; import * as expressionTypes from '../expression_types'; import * as expressionFunctions from '../expression_functions'; import { Execution } from '../execution'; -import { parseExpression } from '../ast'; +import { ExpressionAstFunction, parseExpression } from '../ast'; describe('Executor', () => { test('can instantiate', () => { @@ -152,4 +152,47 @@ describe('Executor', () => { }); }); }); + + describe('.inject', () => { + const executor = new Executor(); + + const injectFn = jest.fn().mockImplementation((args, references) => args); + const extractFn = jest.fn().mockReturnValue({ args: {}, references: [] }); + + const fooFn = { + name: 'foo', + help: 'test', + args: { + bar: { + types: ['string'], + help: 'test', + }, + }, + extract: (state: ExpressionAstFunction['arguments']) => { + return extractFn(state); + }, + inject: (state: ExpressionAstFunction['arguments']) => { + return injectFn(state); + }, + fn: jest.fn(), + }; + executor.registerFunction(fooFn); + + test('calls inject function for every expression function in expression', () => { + executor.inject( + parseExpression('foo bar="baz" | foo bar={foo bar="baz" | foo bar={foo bar="baz"}}'), + [] + ); + expect(injectFn).toBeCalledTimes(5); + }); + + describe('.extract', () => { + test('calls extract function for every expression function in expression', () => { + executor.extract( + parseExpression('foo bar="baz" | foo bar={foo bar="baz" | foo bar={foo bar="baz"}}') + ); + expect(extractFn).toBeCalledTimes(5); + }); + }); + }); }); diff --git a/src/plugins/expressions/common/executor/executor.ts b/src/plugins/expressions/common/executor/executor.ts index 2b5f9f2556d89..28aae8c8f4834 100644 --- a/src/plugins/expressions/common/executor/executor.ts +++ b/src/plugins/expressions/common/executor/executor.ts @@ -19,6 +19,7 @@ /* eslint-disable max-classes-per-file */ +import { cloneDeep, mapValues } from 'lodash'; import { ExecutorState, ExecutorContainer } from './container'; import { createExecutorContainer } from './container'; import { AnyExpressionFunctionDefinition, ExpressionFunction } from '../expression_functions'; @@ -26,9 +27,12 @@ import { Execution, ExecutionParams } from '../execution/execution'; import { IRegistry } from '../types'; import { ExpressionType } from '../expression_types/expression_type'; import { AnyExpressionTypeDefinition } from '../expression_types/types'; -import { ExpressionAstExpression } from '../ast'; +import { ExpressionAstExpression, ExpressionAstFunction } from '../ast'; import { typeSpecs } from '../expression_types/specs'; import { functionSpecs } from '../expression_functions/specs'; +import { getByAlias } from '../util'; +import { SavedObjectReference } from '../../../../core/types'; +import { PersistableState } from '../../../kibana_utils/common'; export interface ExpressionExecOptions { /** @@ -83,7 +87,8 @@ export class FunctionsRegistry implements IRegistry { } } -export class Executor = Record> { +export class Executor = Record> + implements PersistableState { static createWithDefaults = Record>( state?: ExecutorState ): Executor { @@ -197,6 +202,56 @@ export class Executor = Record void + ) { + for (const link of ast.chain) { + const { function: fnName, arguments: fnArgs } = link; + const fn = getByAlias(this.state.get().functions, fnName); + + if (fn) { + // if any of arguments are expressions we should migrate those first + link.arguments = mapValues(fnArgs, (asts, argName) => { + return asts.map((arg) => { + if (typeof arg === 'object') { + return this.walkAst(arg, action); + } + return arg; + }); + }); + + action(fn, link); + } + } + + return ast; + } + + public inject(ast: ExpressionAstExpression, references: SavedObjectReference[]) { + return this.walkAst(cloneDeep(ast), (fn, link) => { + link.arguments = fn.inject(link.arguments, references); + }); + } + + public extract(ast: ExpressionAstExpression) { + const allReferences: SavedObjectReference[] = []; + const newAst = this.walkAst(cloneDeep(ast), (fn, link) => { + const { state, references } = fn.extract(link.arguments); + link.arguments = state; + allReferences.push(...references); + }); + return { state: newAst, references: allReferences }; + } + + public telemetry(ast: ExpressionAstExpression, telemetryData: Record) { + this.walkAst(cloneDeep(ast), (fn, link) => { + telemetryData = fn.telemetry(link.arguments, telemetryData); + }); + + return telemetryData; + } + public fork(): Executor { const initialState = this.state.get(); const fork = new Executor(initialState); diff --git a/src/plugins/expressions/common/expression_functions/expression_function.ts b/src/plugins/expressions/common/expression_functions/expression_function.ts index 71f0d91510136..0b56d3c169ff4 100644 --- a/src/plugins/expressions/common/expression_functions/expression_function.ts +++ b/src/plugins/expressions/common/expression_functions/expression_function.ts @@ -17,12 +17,16 @@ * under the License. */ +import { identity } from 'lodash'; import { AnyExpressionFunctionDefinition } from './types'; import { ExpressionFunctionParameter } from './expression_function_parameter'; import { ExpressionValue } from '../expression_types/types'; import { ExecutionContext } from '../execution'; +import { ExpressionAstFunction } from '../ast'; +import { SavedObjectReference } from '../../../../core/types'; +import { PersistableState } from '../../../kibana_utils/common'; -export class ExpressionFunction { +export class ExpressionFunction implements PersistableState { /** * Name of function */ @@ -60,8 +64,34 @@ export class ExpressionFunction { */ inputTypes: string[] | undefined; + disabled: boolean; + telemetry: ( + state: ExpressionAstFunction['arguments'], + telemetryData: Record + ) => Record; + extract: ( + state: ExpressionAstFunction['arguments'] + ) => { state: ExpressionAstFunction['arguments']; references: SavedObjectReference[] }; + inject: ( + state: ExpressionAstFunction['arguments'], + references: SavedObjectReference[] + ) => ExpressionAstFunction['arguments']; + constructor(functionDefinition: AnyExpressionFunctionDefinition) { - const { name, type, aliases, fn, help, args, inputTypes, context } = functionDefinition; + const { + name, + type, + aliases, + fn, + help, + args, + inputTypes, + context, + disabled, + telemetry, + inject, + extract, + } = functionDefinition; this.name = name; this.type = type; @@ -70,6 +100,10 @@ export class ExpressionFunction { Promise.resolve(fn(input, params, handlers as ExecutionContext)); this.help = help || ''; this.inputTypes = inputTypes || context?.types; + this.disabled = disabled || false; + this.telemetry = telemetry || ((s, c) => c); + this.inject = inject || identity; + this.extract = extract || ((s) => ({ state: s, references: [] })); for (const [key, arg] of Object.entries(args || {})) { this.args[key] = new ExpressionFunctionParameter(key, arg); diff --git a/src/plugins/expressions/common/expression_functions/types.ts b/src/plugins/expressions/common/expression_functions/types.ts index d58d872aff722..caaef541aefd5 100644 --- a/src/plugins/expressions/common/expression_functions/types.ts +++ b/src/plugins/expressions/common/expression_functions/types.ts @@ -30,6 +30,8 @@ import { ExpressionFunctionVar, ExpressionFunctionTheme, } from './specs'; +import { ExpressionAstFunction } from '../ast'; +import { PersistableStateDefinition } from '../../../kibana_utils/common'; /** * `ExpressionFunctionDefinition` is the interface plugins have to implement to @@ -41,12 +43,17 @@ export interface ExpressionFunctionDefinition< Arguments extends Record, Output, Context extends ExecutionContext = ExecutionContext -> { +> extends PersistableStateDefinition { /** * The name of the function, as will be used in expression. */ name: Name; + /** + * if set to true function will be disabled (but its migrate function will still be available) + */ + disabled?: boolean; + /** * Name of type of value this function outputs. */ diff --git a/src/plugins/expressions/common/expression_types/specs/error.ts b/src/plugins/expressions/common/expression_types/specs/error.ts index ebaedcbba0d23..7607945d8a664 100644 --- a/src/plugins/expressions/common/expression_types/specs/error.ts +++ b/src/plugins/expressions/common/expression_types/specs/error.ts @@ -20,20 +20,16 @@ import { ExpressionTypeDefinition, ExpressionValueBoxed } from '../types'; import { ExpressionValueRender } from './render'; import { getType } from '../get_type'; +import { SerializableState } from '../../../../kibana_utils/common'; +import { ErrorLike } from '../../util'; const name = 'error'; export type ExpressionValueError = ExpressionValueBoxed< 'error', { - error: { - message: string; - type?: string; - name?: string; - stack?: string; - original?: Error; - }; - info?: unknown; + error: ErrorLike; + info?: SerializableState; } >; diff --git a/src/plugins/expressions/common/service/expressions_services.ts b/src/plugins/expressions/common/service/expressions_services.ts index b5c98fada07c4..4a87fd9e7f331 100644 --- a/src/plugins/expressions/common/service/expressions_services.ts +++ b/src/plugins/expressions/common/service/expressions_services.ts @@ -23,6 +23,8 @@ import { ExpressionAstExpression } from '../ast'; import { ExecutionContract } from '../execution/execution_contract'; import { AnyExpressionTypeDefinition } from '../expression_types'; import { AnyExpressionFunctionDefinition } from '../expression_functions'; +import { SavedObjectReference } from '../../../../core/types'; +import { PersistableState } from '../../../kibana_utils/common'; /** * The public contract that `ExpressionsService` provides to other plugins @@ -154,7 +156,7 @@ export interface ExpressionServiceParams { * * so that JSDoc appears in developers IDE when they use those `plugins.expressions.registerFunction(`. */ -export class ExpressionsService { +export class ExpressionsService implements PersistableState { public readonly executor: Executor; public readonly renderers: ExpressionRendererRegistry; @@ -256,6 +258,36 @@ export class ExpressionsService { return fork; }; + /** + * Extracts telemetry from expression AST + * @param state expression AST to extract references from + */ + public readonly telemetry = ( + state: ExpressionAstExpression, + telemetryData: Record = {} + ) => { + return this.executor.telemetry(state, telemetryData); + }; + + /** + * Extracts saved object references from expression AST + * @param state expression AST to extract references from + * @returns new expression AST with references removed and array of references + */ + public readonly extract = (state: ExpressionAstExpression) => { + return this.executor.extract(state); + }; + + /** + * Injects saved object references into expression AST + * @param state expression AST to update + * @param references array of saved object references + * @returns new expression AST with references injected + */ + public readonly inject = (state: ExpressionAstExpression, references: SavedObjectReference[]) => { + return this.executor.inject(state, references); + }; + /** * Returns Kibana Platform *setup* life-cycle contract. Useful to return the * same contract on server-side and browser-side. diff --git a/src/plugins/expressions/common/util/create_error.ts b/src/plugins/expressions/common/util/create_error.ts index 9bdab74efd6f9..46306d3fbbf66 100644 --- a/src/plugins/expressions/common/util/create_error.ts +++ b/src/plugins/expressions/common/util/create_error.ts @@ -19,9 +19,17 @@ import { ExpressionValueError } from '../../common'; -type ErrorLike = Partial>; +export type SerializedError = { + name: string; + message: string; + stack?: string; +}; -export const createError = (err: string | Error | ErrorLike): ExpressionValueError => ({ +export type ErrorLike = SerializedError & { + original?: SerializedError; +}; + +export const createError = (err: string | ErrorLike): ExpressionValueError => ({ type: 'error', error: { stack: @@ -32,6 +40,6 @@ export const createError = (err: string | Error | ErrorLike): ExpressionValueErr : undefined, message: typeof err === 'string' ? err : String(err.message), name: typeof err === 'object' ? err.name || 'Error' : 'Error', - original: err instanceof Error ? err : undefined, + original: err instanceof Error ? (err as SerializedError) : undefined, }, }); diff --git a/src/plugins/expressions/public/public.api.md b/src/plugins/expressions/public/public.api.md index 763147df6d922..355bd502df3be 100644 --- a/src/plugins/expressions/public/public.api.md +++ b/src/plugins/expressions/public/public.api.md @@ -189,10 +189,11 @@ export interface ExecutionState extends ExecutorState state: 'not-started' | 'pending' | 'result' | 'error'; } +// Warning: (ae-forgotten-export) The symbol "PersistableState" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "Executor" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class Executor = Record> { +export class Executor = Record> implements PersistableState { constructor(state?: ExecutorState); // (undocumented) get context(): Record; @@ -203,6 +204,11 @@ export class Executor = Record): void; // (undocumented) + extract(ast: ExpressionAstExpression): { + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }; + // (undocumented) fork(): Executor; // @deprecated (undocumented) readonly functions: FunctionsRegistry; @@ -214,6 +220,10 @@ export class Executor = Record; + // Warning: (ae-forgotten-export) The symbol "SavedObjectReference" needs to be exported by the entry point index.d.ts + // + // (undocumented) + inject(ast: ExpressionAstExpression, references: SavedObjectReference[]): ExpressionAstExpression; // (undocumented) registerFunction(functionDefinition: AnyExpressionFunctionDefinition | (() => AnyExpressionFunctionDefinition)): void; // (undocumented) @@ -221,9 +231,11 @@ export class Executor = Record = Record>(ast: string | ExpressionAstExpression, input: Input, context?: ExtraContext): Promise; // (undocumented) readonly state: ExecutorContainer; + // (undocumented) + telemetry(ast: ExpressionAstExpression, telemetryData: Record): Record; // @deprecated (undocumented) readonly types: TypesRegistry; -} + } // Warning: (ae-forgotten-export) The symbol "ExecutorPureTransitions" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "ExecutorPureSelectors" needs to be exported by the entry point index.d.ts @@ -252,12 +264,10 @@ export type ExpressionAstArgument = string | boolean | number | ExpressionAstExp // Warning: (ae-missing-release-tag) "ExpressionAstExpression" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export interface ExpressionAstExpression { - // (undocumented) - chain: ExpressionAstFunction[]; - // (undocumented) +export type ExpressionAstExpression = { type: 'expression'; -} + chain: ExpressionAstFunction[]; +}; // Warning: (ae-missing-release-tag) "ExpressionAstExpressionBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -273,16 +283,12 @@ export interface ExpressionAstExpressionBuilder { // Warning: (ae-missing-release-tag) "ExpressionAstFunction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export interface ExpressionAstFunction { - // (undocumented) +export type ExpressionAstFunction = { + type: 'function'; + function: string; arguments: Record; - // Warning: (ae-forgotten-export) The symbol "ExpressionAstFunctionDebug" needs to be exported by the entry point index.d.ts debug?: ExpressionAstFunctionDebug; - // (undocumented) - function: string; - // (undocumented) - type: 'function'; -} +}; // Warning: (ae-missing-release-tag) "ExpressionAstFunctionBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -320,23 +326,35 @@ export interface ExpressionExecutor { // Warning: (ae-missing-release-tag) "ExpressionFunction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class ExpressionFunction { +export class ExpressionFunction implements PersistableState { constructor(functionDefinition: AnyExpressionFunctionDefinition); // (undocumented) accepts: (type: string) => boolean; aliases: string[]; args: Record; + // (undocumented) + disabled: boolean; + // (undocumented) + extract: (state: ExpressionAstFunction['arguments']) => { + state: ExpressionAstFunction['arguments']; + references: SavedObjectReference[]; + }; fn: (input: ExpressionValue, params: Record, handlers: object) => ExpressionValue; help: string; + // (undocumented) + inject: (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments']; inputTypes: string[] | undefined; name: string; + // (undocumented) + telemetry: (state: ExpressionAstFunction['arguments'], telemetryData: Record) => Record; type: string; } +// Warning: (ae-forgotten-export) The symbol "PersistableStateDefinition" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ExpressionFunctionDefinition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> { +export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> extends PersistableStateDefinition { aliases?: string[]; args: { [key in keyof Arguments]: ArgumentType; @@ -345,6 +363,7 @@ export interface ExpressionFunctionDefinition>; @@ -540,13 +559,17 @@ export { ExpressionsPublicPlugin as Plugin } // Warning: (ae-missing-release-tag) "ExpressionsService" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export class ExpressionsService { +export class ExpressionsService implements PersistableState { // Warning: (ae-forgotten-export) The symbol "ExpressionServiceParams" needs to be exported by the entry point index.d.ts constructor({ executor, renderers, }?: ExpressionServiceParams); // (undocumented) readonly execute: ExpressionsServiceStart['execute']; // (undocumented) readonly executor: Executor; + readonly extract: (state: ExpressionAstExpression) => { + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }; // (undocumented) readonly fork: () => ExpressionsService; // (undocumented) @@ -558,6 +581,7 @@ export class ExpressionsService { // (undocumented) readonly getType: ExpressionsServiceStart['getType']; readonly getTypes: () => ReturnType; + readonly inject: (state: ExpressionAstExpression, references: SavedObjectReference[]) => ExpressionAstExpression; readonly registerFunction: (functionDefinition: AnyExpressionFunctionDefinition | (() => AnyExpressionFunctionDefinition)) => void; // (undocumented) readonly registerRenderer: (definition: AnyExpressionRenderDefinition | (() => AnyExpressionRenderDefinition)) => void; @@ -571,6 +595,7 @@ export class ExpressionsService { start(): ExpressionsServiceStart; // (undocumented) stop(): void; + readonly telemetry: (state: ExpressionAstExpression, telemetryData?: Record) => Record; } // Warning: (ae-missing-release-tag) "ExpressionsServiceSetup" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -705,14 +730,8 @@ export type ExpressionValueConverter; // Warning: (ae-missing-release-tag) "ExpressionValueFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1162,6 +1181,12 @@ export type TypeToString = KnownTypeToString | UnmappedTypeStrings; export type UnmappedTypeStrings = 'date' | 'filter'; +// Warnings were encountered during analysis: +// +// src/plugins/expressions/common/ast/types.ts:40:3 - (ae-forgotten-export) The symbol "ExpressionAstFunctionDebug" needs to be exported by the entry point index.d.ts +// src/plugins/expressions/common/expression_types/specs/error.ts:31:5 - (ae-forgotten-export) The symbol "ErrorLike" needs to be exported by the entry point index.d.ts +// src/plugins/expressions/common/expression_types/specs/error.ts:32:5 - (ae-forgotten-export) The symbol "SerializableState" needs to be exported by the entry point index.d.ts + // (No @packageDocumentation comment for this package) ``` diff --git a/src/plugins/expressions/server/server.api.md b/src/plugins/expressions/server/server.api.md index 8266789664d44..1a905de4a3bdf 100644 --- a/src/plugins/expressions/server/server.api.md +++ b/src/plugins/expressions/server/server.api.md @@ -171,10 +171,11 @@ export interface ExecutionState extends ExecutorState state: 'not-started' | 'pending' | 'result' | 'error'; } +// Warning: (ae-forgotten-export) The symbol "PersistableState" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "Executor" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class Executor = Record> { +export class Executor = Record> implements PersistableState { constructor(state?: ExecutorState); // (undocumented) get context(): Record; @@ -185,6 +186,11 @@ export class Executor = Record): void; // (undocumented) + extract(ast: ExpressionAstExpression): { + state: ExpressionAstExpression; + references: SavedObjectReference[]; + }; + // (undocumented) fork(): Executor; // @deprecated (undocumented) readonly functions: FunctionsRegistry; @@ -196,6 +202,10 @@ export class Executor = Record; + // Warning: (ae-forgotten-export) The symbol "SavedObjectReference" needs to be exported by the entry point index.d.ts + // + // (undocumented) + inject(ast: ExpressionAstExpression, references: SavedObjectReference[]): ExpressionAstExpression; // (undocumented) registerFunction(functionDefinition: AnyExpressionFunctionDefinition | (() => AnyExpressionFunctionDefinition)): void; // (undocumented) @@ -203,9 +213,11 @@ export class Executor = Record = Record>(ast: string | ExpressionAstExpression, input: Input, context?: ExtraContext): Promise; // (undocumented) readonly state: ExecutorContainer; + // (undocumented) + telemetry(ast: ExpressionAstExpression, telemetryData: Record): Record; // @deprecated (undocumented) readonly types: TypesRegistry; -} + } // Warning: (ae-forgotten-export) The symbol "ExecutorPureTransitions" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "ExecutorPureSelectors" needs to be exported by the entry point index.d.ts @@ -234,12 +246,10 @@ export type ExpressionAstArgument = string | boolean | number | ExpressionAstExp // Warning: (ae-missing-release-tag) "ExpressionAstExpression" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export interface ExpressionAstExpression { - // (undocumented) - chain: ExpressionAstFunction[]; - // (undocumented) +export type ExpressionAstExpression = { type: 'expression'; -} + chain: ExpressionAstFunction[]; +}; // Warning: (ae-missing-release-tag) "ExpressionAstExpressionBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -255,16 +265,12 @@ export interface ExpressionAstExpressionBuilder { // Warning: (ae-missing-release-tag) "ExpressionAstFunction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export interface ExpressionAstFunction { - // (undocumented) +export type ExpressionAstFunction = { + type: 'function'; + function: string; arguments: Record; - // Warning: (ae-forgotten-export) The symbol "ExpressionAstFunctionDebug" needs to be exported by the entry point index.d.ts debug?: ExpressionAstFunctionDebug; - // (undocumented) - function: string; - // (undocumented) - type: 'function'; -} +}; // Warning: (ae-missing-release-tag) "ExpressionAstFunctionBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -292,23 +298,35 @@ export type ExpressionAstNode = ExpressionAstExpression | ExpressionAstFunction // Warning: (ae-missing-release-tag) "ExpressionFunction" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class ExpressionFunction { +export class ExpressionFunction implements PersistableState { constructor(functionDefinition: AnyExpressionFunctionDefinition); // (undocumented) accepts: (type: string) => boolean; aliases: string[]; args: Record; + // (undocumented) + disabled: boolean; + // (undocumented) + extract: (state: ExpressionAstFunction['arguments']) => { + state: ExpressionAstFunction['arguments']; + references: SavedObjectReference[]; + }; fn: (input: ExpressionValue, params: Record, handlers: object) => ExpressionValue; help: string; + // (undocumented) + inject: (state: ExpressionAstFunction['arguments'], references: SavedObjectReference[]) => ExpressionAstFunction['arguments']; inputTypes: string[] | undefined; name: string; + // (undocumented) + telemetry: (state: ExpressionAstFunction['arguments'], telemetryData: Record) => Record; type: string; } +// Warning: (ae-forgotten-export) The symbol "PersistableStateDefinition" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "ExpressionFunctionDefinition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> { +export interface ExpressionFunctionDefinition, Output, Context extends ExecutionContext = ExecutionContext> extends PersistableStateDefinition { aliases?: string[]; args: { [key in keyof Arguments]: ArgumentType; @@ -317,6 +335,7 @@ export interface ExpressionFunctionDefinition>; @@ -565,14 +584,8 @@ export type ExpressionValueConverter; // Warning: (ae-missing-release-tag) "ExpressionValueFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -966,6 +979,12 @@ export type TypeToString = KnownTypeToString | UnmappedTypeStrings; export type UnmappedTypeStrings = 'date' | 'filter'; +// Warnings were encountered during analysis: +// +// src/plugins/expressions/common/ast/types.ts:40:3 - (ae-forgotten-export) The symbol "ExpressionAstFunctionDebug" needs to be exported by the entry point index.d.ts +// src/plugins/expressions/common/expression_types/specs/error.ts:31:5 - (ae-forgotten-export) The symbol "ErrorLike" needs to be exported by the entry point index.d.ts +// src/plugins/expressions/common/expression_types/specs/error.ts:32:5 - (ae-forgotten-export) The symbol "SerializableState" needs to be exported by the entry point index.d.ts + // (No @packageDocumentation comment for this package) ``` From 69564983c23b05d2220ede403e67c2e0b46601ca Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 12 Oct 2020 11:54:11 -0500 Subject: [PATCH 03/85] Only send agent data for non-opentelemetry agents (#79587) --- .../__snapshots__/apm_telemetry.test.ts.snap | 594 ----------- .../apm/server/lib/apm_telemetry/schema.ts | 15 +- .../apm/server/lib/apm_telemetry/types.ts | 7 +- .../apm/typings/es_schemas/ui/fields/agent.ts | 16 +- .../schema/xpack_plugins.json | 924 ------------------ 5 files changed, 17 insertions(+), 1539 deletions(-) diff --git a/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap b/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap index 9f7a911bf21c7..ccd5f143440da 100644 --- a/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap +++ b/x-pack/plugins/apm/common/__snapshots__/apm_telemetry.test.ts.snap @@ -505,600 +505,6 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the } } } - }, - "otlp": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/cpp": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/dotnet": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/erlang": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/go": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/java": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/nodejs": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/php": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/python": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/ruby": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } - }, - "opentelemetry/webjs": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "keyword" - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "language": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "keyword" - }, - "version": { - "type": "keyword" - }, - "composite": { - "type": "keyword" - } - } - } - } - } - } } } }, diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts index 4bbda9add0fdb..ba2f7617c5108 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts @@ -12,7 +12,7 @@ import { TimeframeMap1d, TimeframeMapAll, } from './types'; -import { AgentName } from '../../../typings/es_schemas/ui/fields/agent'; +import { ElasticAgentName } from '../../../typings/es_schemas/ui/fields/agent'; const long: { type: 'long' } = { type: 'long' }; @@ -34,7 +34,7 @@ const timeframeMapSchema: MakeSchemaFrom = { ...timeframeMapAllSchema, }; -const agentSchema: MakeSchemaFrom['agents'][AgentName] = { +const agentSchema: MakeSchemaFrom['agents'][ElasticAgentName] = { agent: { version: { type: 'array', items: { type: 'keyword' } }, }, @@ -101,17 +101,6 @@ const apmPerAgentSchema: Pick< python: agentSchema, ruby: agentSchema, 'rum-js': agentSchema, - otlp: agentSchema, - 'opentelemetry/cpp': agentSchema, - 'opentelemetry/dotnet': agentSchema, - 'opentelemetry/erlang': agentSchema, - 'opentelemetry/go': agentSchema, - 'opentelemetry/java': agentSchema, - 'opentelemetry/nodejs': agentSchema, - 'opentelemetry/php': agentSchema, - 'opentelemetry/python': agentSchema, - 'opentelemetry/ruby': agentSchema, - 'opentelemetry/webjs': agentSchema, }, }; diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts index 7ed79752b43c4..5d0f3172a4806 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/types.ts @@ -5,7 +5,10 @@ */ import { DeepPartial } from 'utility-types'; -import { AgentName } from '../../../typings/es_schemas/ui/fields/agent'; +import { + AgentName, + ElasticAgentName, +} from '../../../typings/es_schemas/ui/fields/agent'; export interface TimeframeMap { '1d': number; @@ -86,7 +89,7 @@ export interface APMUsage { }; }; agents: Record< - AgentName, + ElasticAgentName, { agent: { version: string[]; diff --git a/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts b/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts index b5f3ae834d5e2..608f8ff49ce5a 100644 --- a/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts +++ b/x-pack/plugins/apm/typings/es_schemas/ui/fields/agent.ts @@ -4,11 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -/* - * Support additional agent types by appending definitions in mappings.json - * (for telemetry) and the AgentName type. - */ -export type AgentName = +export type ElasticAgentName = | 'go' | 'java' | 'js-base' @@ -16,7 +12,9 @@ export type AgentName = | 'nodejs' | 'python' | 'dotnet' - | 'ruby' + | 'ruby'; + +export type OpenTelemetryAgentName = | 'otlp' | 'opentelemetry/cpp' | 'opentelemetry/dotnet' @@ -29,6 +27,12 @@ export type AgentName = | 'opentelemetry/ruby' | 'opentelemetry/webjs'; +/* + * Support additional agent types by appending definitions in mappings.json + * (for telemetry) and the AgentName type. + */ +export type AgentName = ElasticAgentName | OpenTelemetryAgentName; + export interface Agent { ephemeral_id?: string; name: AgentName; diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 478c7e42a0c16..396a06205eaa9 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -1006,930 +1006,6 @@ } } } - }, - "otlp": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/cpp": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/dotnet": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/erlang": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/go": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/java": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/nodejs": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/php": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/python": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/ruby": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } - }, - "opentelemetry/webjs": { - "properties": { - "agent": { - "properties": { - "version": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "service": { - "properties": { - "framework": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "language": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - }, - "runtime": { - "properties": { - "name": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "version": { - "type": "array", - "items": { - "type": "keyword" - } - }, - "composite": { - "type": "array", - "items": { - "type": "keyword" - } - } - } - } - } - } - } } } }, From ecbba93facca14f24f9f12384b3d33530f1f92d3 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Mon, 12 Oct 2020 20:12:04 +0300 Subject: [PATCH 04/85] do not refetch license if signature header absents from a response (#79645) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../plugins/licensing/public/plugin.test.ts | 40 +++++++++++++++++++ x-pack/plugins/licensing/public/plugin.ts | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/licensing/public/plugin.test.ts b/x-pack/plugins/licensing/public/plugin.test.ts index ce3fcdb042326..f82e0488d0386 100644 --- a/x-pack/plugins/licensing/public/plugin.test.ts +++ b/x-pack/plugins/licensing/public/plugin.test.ts @@ -240,6 +240,46 @@ describe('licensing plugin', () => { expect(coreSetup.http.get).toHaveBeenCalledTimes(1); }); + it('http interceptor does not trigger re-fetch if signature header is not present', async () => { + const sessionStorage = coreMock.createStorage(); + plugin = new LicensingPlugin(coreMock.createPluginInitializerContext(), sessionStorage); + + const coreSetup = coreMock.createSetup(); + + coreSetup.http.get.mockResolvedValue(licenseMock.createLicense({ signature: 'signature-1' })); + + let registeredInterceptor: HttpInterceptor; + coreSetup.http.intercept.mockImplementation((interceptor: HttpInterceptor) => { + registeredInterceptor = interceptor; + return () => undefined; + }); + + await plugin.setup(coreSetup); + await plugin.start(coreStart); + expect(registeredInterceptor!.response).toBeDefined(); + + const httpResponse = { + response: { + headers: { + get(name: string) { + if (name === 'kbn-license-sig') { + return undefined; + } + throw new Error('unexpected header'); + }, + }, + }, + request: { + url: 'http://10.10.10.10:5601/api/hello', + }, + }; + expect(coreSetup.http.get).toHaveBeenCalledTimes(0); + + await registeredInterceptor!.response!(httpResponse as any, null as any); + + expect(coreSetup.http.get).toHaveBeenCalledTimes(0); + }); + it('http interceptor does not trigger license re-fetch for anonymous pages', async () => { const sessionStorage = coreMock.createStorage(); plugin = new LicensingPlugin(coreMock.createPluginInitializerContext(), sessionStorage); diff --git a/x-pack/plugins/licensing/public/plugin.ts b/x-pack/plugins/licensing/public/plugin.ts index 3f945756691b3..f5832d0bb7d93 100644 --- a/x-pack/plugins/licensing/public/plugin.ts +++ b/x-pack/plugins/licensing/public/plugin.ts @@ -101,7 +101,7 @@ export class LicensingPlugin implements Plugin Date: Mon, 12 Oct 2020 13:19:50 -0400 Subject: [PATCH 05/85] [Ingest Manager] Remove fields from index pattern during package uninstall (#80082) * Correctly removing index pattern fields * Adding comment about try/catch --- .../server/services/epm/packages/remove.ts | 8 ++-- .../apis/epm/install_remove_assets.ts | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) 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 417f2871a6cbf..8d5995f92c95f 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 @@ -44,9 +44,6 @@ export async function removeInstallation(options: { `unable to remove package with existing package policy(s) in use by agent(s)` ); - // recreate or delete index patterns when a package is uninstalled - await installIndexPatterns(savedObjectsClient); - // Delete the installed assets const installedAssets = [...installation.installed_kibana, ...installation.installed_es]; await deleteAssets(installedAssets, savedObjectsClient, callCluster); @@ -55,6 +52,11 @@ export async function removeInstallation(options: { // could also update with [] or some other state await savedObjectsClient.delete(PACKAGES_SAVED_OBJECT_TYPE, pkgName); + // recreate or delete index patterns when a package is uninstalled + // this must be done after deleting the saved object for the current package otherwise it will retrieve the package + // from the registry again and reinstall the index patterns + await installIndexPatterns(savedObjectsClient); + // remove the package archive and its contents from the cache so that a reinstall fetches // a fresh copy from the registry deletePackageCache(pkgName, pkgVersion); diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts index 16a500ddf85ee..cc6a384dcaafe 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts @@ -35,6 +35,9 @@ export default function (providerContext: FtrProviderContext) { before(async () => { await installPackage(pkgKey); }); + after(async () => { + await uninstallPackage(pkgKey); + }); it('should have installed the ILM policy', async function () { const resPolicy = await es.transport.request({ method: 'GET', @@ -218,6 +221,9 @@ export default function (providerContext: FtrProviderContext) { describe('uninstalls all assets when uninstalling a package', async () => { skipIfNoDockerRegistry(providerContext); before(async () => { + // these tests ensure that uninstall works properly so make sure that the package gets installed and uninstalled + // and then we'll test that not artifacts are left behind. + await installPackage(pkgKey); await uninstallPackage(pkgKey); }); it('should have uninstalled the index templates', async function () { @@ -342,6 +348,48 @@ export default function (providerContext: FtrProviderContext) { } expect(resSearch.response.data.statusCode).equal(404); }); + it('should have removed the fields from the index patterns', async () => { + // The reason there is an expect inside the try and inside the catch in this test case is to guard against two + // different scenarios. + // + // If a test case in another file calls /setup then the system and endpoint packages will be installed and + // will be present for the remainder of the tests (because they cannot be removed). If that is the case the + // expect in the try will work because the logs-* and metrics-* index patterns will still be present even + // after this test uninstalls its package. + // + // If /setup was never called prior to this test, when the test package is uninstalled the index pattern code + // checks to see if there are no packages installed and completely removes the logs-* and metrics-* index + // patterns. If that happens this code will throw an error and indicate that the index pattern being searched + // for was completely removed. In this case the catch's expect will test to make sure the error thrown was + // a 404 because all of the packages have been removed. + try { + const resIndexPatternLogs = await kibanaServer.savedObjects.get({ + type: 'index-pattern', + id: 'logs-*', + }); + const fields = JSON.parse(resIndexPatternLogs.attributes.fields); + const exists = fields.find((field: { name: string }) => field.name === 'logs_test_name'); + expect(exists).to.be(undefined); + } catch (err) { + // if all packages are uninstalled there won't be a logs-* index pattern + expect(err.response.data.statusCode).equal(404); + } + + try { + const resIndexPatternMetrics = await kibanaServer.savedObjects.get({ + type: 'index-pattern', + id: 'metrics-*', + }); + const fieldsMetrics = JSON.parse(resIndexPatternMetrics.attributes.fields); + const existsMetrics = fieldsMetrics.find( + (field: { name: string }) => field.name === 'metrics_test_name' + ); + expect(existsMetrics).to.be(undefined); + } catch (err) { + // if all packages are uninstalled there won't be a metrics-* index pattern + expect(err.response.data.statusCode).equal(404); + } + }); it('should have removed the saved object', async function () { let res; try { From 591585df173073b7fb7e64009b542b84ff43fd68 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Mon, 12 Oct 2020 13:22:33 -0400 Subject: [PATCH 06/85] [Security Solution] [Resolver] Remove related events api (#79036) * Removing old related events route * Removing outer describe block Co-authored-by: Elastic Machine --- .../common/endpoint/schema/resolver.ts | 17 - .../common/endpoint/types/index.ts | 10 - .../server/endpoint/routes/resolver.ts | 13 - .../resolver/queries/related_events.test.ts | 35 -- .../routes/resolver/queries/related_events.ts | 92 ---- .../routes/resolver/related_events.ts | 44 -- .../resolver/utils/events_query_handler.ts | 96 ---- .../endpoint/routes/resolver/utils/fetch.ts | 37 -- .../endpoint/routes/resolver/utils/node.ts | 20 - .../routes/resolver/utils/tree.test.ts | 21 +- .../endpoint/routes/resolver/utils/tree.ts | 17 - .../apis/resolver/events.ts | 422 +++++------------- .../apis/resolver/tree.ts | 5 - 13 files changed, 124 insertions(+), 705 deletions(-) delete mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.test.ts delete mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.ts delete mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/resolver/related_events.ts delete mode 100644 x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/events_query_handler.ts diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts b/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts index a6d59615794a6..1dd5668b3177a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/resolver.ts @@ -23,23 +23,6 @@ export const validateTree = { }), }; -/** - * Used to validate GET requests for non process events for a specific event. - */ -export const validateRelatedEvents = { - params: schema.object({ id: schema.string({ minLength: 1 }) }), - query: schema.object({ - events: schema.number({ defaultValue: 1000, min: 1, max: 10000 }), - afterEvent: schema.maybe(schema.string()), - legacyEndpointID: schema.maybe(schema.string({ minLength: 1 })), - }), - body: schema.nullable( - schema.object({ - filter: schema.maybe(schema.string()), - }) - ), -}; - /** * Used to validate POST requests for `/resolver/events` api. */ diff --git a/x-pack/plugins/security_solution/common/endpoint/types/index.ts b/x-pack/plugins/security_solution/common/endpoint/types/index.ts index 0054c1f1abdd5..510f1833b793b 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/index.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/index.ts @@ -197,7 +197,6 @@ export interface SafeResolverTree { */ entityID: string; children: SafeResolverChildren; - relatedEvents: Omit; relatedAlerts: Omit; ancestry: SafeResolverAncestry; lifecycle: SafeResolverEvent[]; @@ -267,15 +266,6 @@ export interface ResolverRelatedEvents { nextEvent: string | null; } -/** - * Safe version of `ResolverRelatedEvents` - */ -export interface SafeResolverRelatedEvents { - entityID: string; - events: SafeResolverEvent[]; - nextEvent: string | null; -} - /** * Response structure for the events route. * `nextEvent` will be set to null when at the time of querying there were no more results to retrieve from ES. diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts index c9159032a7917..b5d657fe55a1f 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver.ts @@ -8,14 +8,12 @@ import { IRouter } from 'kibana/server'; import { EndpointAppContext } from '../types'; import { validateTree, - validateRelatedEvents, validateEvents, validateChildren, validateAncestry, validateAlerts, validateEntities, } from '../../../common/endpoint/schema/resolver'; -import { handleRelatedEvents } from './resolver/related_events'; import { handleChildren } from './resolver/children'; import { handleAncestry } from './resolver/ancestry'; import { handleTree } from './resolver/tree'; @@ -26,17 +24,6 @@ import { handleEvents } from './resolver/events'; export function registerResolverRoutes(router: IRouter, endpointAppContext: EndpointAppContext) { const log = endpointAppContext.logFactory.get('resolver'); - // this route will be removed in favor of the one below - router.post( - { - // @deprecated use `/resolver/events` instead - path: '/api/endpoint/resolver/{id}/events', - validate: validateRelatedEvents, - options: { authRequired: true }, - }, - handleRelatedEvents(log, endpointAppContext) - ); - router.post( { path: '/api/endpoint/resolver/events', diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.test.ts deleted file mode 100644 index 3ddf8fa4090d6..0000000000000 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.test.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. - */ -/** - * @deprecated use the `events.ts` file's query instead - */ -import { EventsQuery } from './related_events'; -import { PaginationBuilder } from '../utils/pagination'; -import { legacyEventIndexPattern } from './legacy_event_index_pattern'; - -describe('Events query', () => { - it('constructs a legacy multi search query', () => { - const query = new EventsQuery(new PaginationBuilder(1), 'index-pattern', 'endpointID'); - // using any here because otherwise ts complains that it doesn't know what bool and filter are - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const msearch: any = query.buildMSearch('1234'); - expect(msearch[0].index).toBe(legacyEventIndexPattern); - expect(msearch[1].query.bool.filter[0]).toStrictEqual({ - terms: { 'endgame.unique_pid': ['1234'] }, - }); - }); - - it('constructs a non-legacy multi search query', () => { - const query = new EventsQuery(new PaginationBuilder(1), 'index-pattern'); - // using any here because otherwise ts complains that it doesn't know what bool and filter are - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const msearch: any = query.buildMSearch(['1234', '5678']); - expect(msearch[0].index).toBe('index-pattern'); - expect(msearch[1].query.bool.filter[0]).toStrictEqual({ - terms: { 'process.entity_id': ['1234', '5678'] }, - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.ts deleted file mode 100644 index f419c1fb6e1d5..0000000000000 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/queries/related_events.ts +++ /dev/null @@ -1,92 +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. - */ -/** - * @deprecated use the `events.ts` file's query instead - */ -import { SearchResponse } from 'elasticsearch'; -import { esKuery } from '../../../../../../../../src/plugins/data/server'; -import { SafeResolverEvent } from '../../../../../common/endpoint/types'; -import { ResolverQuery } from './base'; -import { PaginationBuilder } from '../utils/pagination'; -import { JsonObject } from '../../../../../../../../src/plugins/kibana_utils/common'; - -/** - * Builds a query for retrieving related events for a node. - */ -export class EventsQuery extends ResolverQuery { - private readonly kqlQuery: JsonObject[] = []; - - constructor( - private readonly pagination: PaginationBuilder, - indexPattern: string | string[], - endpointID?: string, - kql?: string - ) { - super(indexPattern, endpointID); - if (kql) { - this.kqlQuery.push(esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(kql))); - } - } - - protected legacyQuery(endpointID: string, uniquePIDs: string[]): JsonObject { - return { - query: { - bool: { - filter: [ - ...this.kqlQuery, - { - terms: { 'endgame.unique_pid': uniquePIDs }, - }, - { - term: { 'agent.id': endpointID }, - }, - { - term: { 'event.kind': 'event' }, - }, - { - bool: { - must_not: { - term: { 'event.category': 'process' }, - }, - }, - }, - ], - }, - }, - ...this.pagination.buildQueryFields('endgame.serial_event_id', 'desc'), - }; - } - - protected query(entityIDs: string[]): JsonObject { - return { - query: { - bool: { - filter: [ - ...this.kqlQuery, - { - terms: { 'process.entity_id': entityIDs }, - }, - { - term: { 'event.kind': 'event' }, - }, - { - bool: { - must_not: { - term: { 'event.category': 'process' }, - }, - }, - }, - ], - }, - }, - ...this.pagination.buildQueryFields('event.id', 'desc'), - }; - } - - formatResponse(response: SearchResponse): SafeResolverEvent[] { - return this.getResults(response); - } -} diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/related_events.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/related_events.ts deleted file mode 100644 index 8fd9ab9a5ccd3..0000000000000 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/related_events.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. - */ - -/** - * @deprecated use the `resolver/events` route and handler instead - */ -import { TypeOf } from '@kbn/config-schema'; -import { RequestHandler, Logger } from 'kibana/server'; -import { eventsIndexPattern, alertsIndexPattern } from '../../../../common/endpoint/constants'; -import { validateRelatedEvents } from '../../../../common/endpoint/schema/resolver'; -import { Fetcher } from './utils/fetch'; -import { EndpointAppContext } from '../../types'; - -export function handleRelatedEvents( - log: Logger, - endpointAppContext: EndpointAppContext -): RequestHandler< - TypeOf, - TypeOf, - TypeOf -> { - return async (context, req, res) => { - const { - params: { id }, - query: { events, afterEvent, legacyEndpointID: endpointID }, - body, - } = req; - try { - const client = context.core.elasticsearch.legacy.client; - - const fetcher = new Fetcher(client, id, eventsIndexPattern, alertsIndexPattern, endpointID); - - return res.ok({ - body: await fetcher.events(events, afterEvent, body?.filter), - }); - } catch (err) { - log.warn(err); - return res.internalError({ body: err }); - } - }; -} diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/events_query_handler.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/events_query_handler.ts deleted file mode 100644 index a5aa9b6c288c8..0000000000000 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/events_query_handler.ts +++ /dev/null @@ -1,96 +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. - */ -/** - * @deprecated msearch functionality for querying events will be removed shortly - */ -import { SearchResponse } from 'elasticsearch'; -import { ILegacyScopedClusterClient } from 'kibana/server'; -import { SafeResolverRelatedEvents, SafeResolverEvent } from '../../../../../common/endpoint/types'; -import { createRelatedEvents } from './node'; -import { EventsQuery } from '../queries/related_events'; -import { PaginationBuilder } from './pagination'; -import { QueryInfo } from '../queries/multi_searcher'; -import { SingleQueryHandler } from './fetch'; - -/** - * Parameters for the RelatedEventsQueryHandler - */ -export interface RelatedEventsParams { - limit: number; - entityID: string; - indexPattern: string; - after?: string; - legacyEndpointID?: string; - filter?: string; -} - -/** - * This retrieves the related events for the origin node of a resolver tree. - */ -export class RelatedEventsQueryHandler implements SingleQueryHandler { - private relatedEvents: SafeResolverRelatedEvents | undefined; - private readonly query: EventsQuery; - private readonly limit: number; - private readonly entityID: string; - - constructor(options: RelatedEventsParams) { - this.limit = options.limit; - this.entityID = options.entityID; - - this.query = new EventsQuery( - PaginationBuilder.createBuilder(this.limit, options.after), - options.indexPattern, - options.legacyEndpointID, - options.filter - ); - } - - private handleResponse = (response: SearchResponse) => { - const results = this.query.formatResponse(response); - this.relatedEvents = createRelatedEvents( - this.entityID, - results, - PaginationBuilder.buildCursorRequestLimit(this.limit, results) - ); - }; - - /** - * Get a query to use in a msearch. - */ - nextQuery(): QueryInfo | undefined { - if (this.getResults()) { - return; - } - - return { - query: this.query, - ids: this.entityID, - handler: this.handleResponse, - }; - } - - /** - * Get the results after an msearch. - */ - getResults() { - return this.relatedEvents; - } - - /** - * Perform a normal search and return the related events results. - * - * @param client the elasticsearch client - */ - async search(client: ILegacyScopedClusterClient) { - const results = this.getResults(); - if (results) { - return results; - } - - this.handleResponse(await this.query.search(client, this.entityID)); - return this.getResults() ?? createRelatedEvents(this.entityID); - } -} diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/fetch.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/fetch.ts index 15a9639872f2a..8f17a20e182ad 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/fetch.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/fetch.ts @@ -7,7 +7,6 @@ import { ILegacyScopedClusterClient } from 'kibana/server'; import { SafeResolverChildren, - SafeResolverRelatedEvents, SafeResolverAncestry, ResolverRelatedAlerts, SafeResolverLifecycleNode, @@ -18,7 +17,6 @@ import { StatsQuery } from '../queries/stats'; import { createLifecycle } from './node'; import { MultiSearcher, QueryInfo } from '../queries/multi_searcher'; import { AncestryQueryHandler } from './ancestry_query_handler'; -import { RelatedEventsQueryHandler } from './events_query_handler'; import { RelatedAlertsQueryHandler } from './alerts_query_handler'; import { ChildrenStartQueryHandler } from './children_start_query_handler'; import { ChildrenLifecycleQueryHandler } from './children_lifecycle_query_handler'; @@ -110,14 +108,6 @@ export class Fetcher { this.endpointID ); - const eventsHandler = new RelatedEventsQueryHandler({ - limit: options.events, - entityID: this.id, - after: options.afterEvent, - indexPattern: this.eventsIndexPattern, - legacyEndpointID: this.endpointID, - }); - const alertsHandler = new RelatedAlertsQueryHandler({ limit: options.alerts, entityID: this.id, @@ -139,7 +129,6 @@ export class Fetcher { const msearch = new MultiSearcher(this.client); let queries: QueryInfo[] = []; - addQueryToList(eventsHandler, queries); addQueryToList(alertsHandler, queries); addQueryToList(childrenHandler, queries); addQueryToList(originHandler, queries); @@ -176,7 +165,6 @@ export class Fetcher { const tree = new Tree(this.id, { ancestry: ancestryHandler.getResults(), - relatedEvents: eventsHandler.getResults(), relatedAlerts: alertsHandler.getResults(), children: childrenLifecycleHandler.getResults(), }); @@ -225,31 +213,6 @@ export class Fetcher { return childrenLifecycleHandler.search(this.client); } - /** - * Retrieves the related events for the origin node. - * - * @param limit the upper bound number of related events to return. The limit is applied after the cursor is used to - * skip the previous results. - * @param after a cursor to use as the starting point for retrieving related events - * @param filter a kql query for filtering the results - */ - public async events( - limit: number, - after?: string, - filter?: string - ): Promise { - const eventsHandler = new RelatedEventsQueryHandler({ - limit, - entityID: this.id, - after, - indexPattern: this.eventsIndexPattern, - legacyEndpointID: this.endpointID, - filter, - }); - - return eventsHandler.search(this.client); - } - /** * Retrieves the alerts for the origin node. * diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/node.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/node.ts index cecdc8a478958..286564d9302c1 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/node.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/node.ts @@ -12,25 +12,9 @@ import { SafeResolverLifecycleNode, SafeResolverEvent, SafeResolverChildNode, - SafeResolverRelatedEvents, ResolverPaginatedEvents, } from '../../../../../common/endpoint/types'; -/** - * Creates a related event object that the related events handler would return - * - * @param entityID the entity_id for these related events - * @param events array of related events - * @param nextEvent the cursor to retrieve the next related event - */ -export function createRelatedEvents( - entityID: string, - events: SafeResolverEvent[] = [], - nextEvent: string | null = null -): SafeResolverRelatedEvents { - return { entityID, events, nextEvent }; -} - /** * Creates an object that the events handler would return * @@ -116,10 +100,6 @@ export function createTree(entityID: string): SafeResolverTree { childNodes: [], nextChild: null, }, - relatedEvents: { - events: [], - nextEvent: null, - }, relatedAlerts: { alerts: [], nextAlert: null, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.test.ts index 290af87a61b1d..ce933380e9f34 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.test.ts @@ -6,11 +6,7 @@ import { EndpointDocGenerator } from '../../../../../common/endpoint/generate_data'; import { Tree } from './tree'; -import { - SafeResolverAncestry, - SafeResolverEvent, - SafeResolverRelatedEvents, -} from '../../../../../common/endpoint/types'; +import { SafeResolverAncestry, SafeResolverEvent } from '../../../../../common/endpoint/types'; import { entityIDSafeVersion } from '../../../../../common/endpoint/models/event'; describe('Tree', () => { @@ -46,19 +42,4 @@ describe('Tree', () => { expect(tree.render().ancestry.nextAncestor).toEqual('hello'); }); }); - - describe('related events', () => { - it('adds related events to the tree', () => { - const root = generator.generateEvent(); - const events: SafeResolverRelatedEvents = { - entityID: entityIDSafeVersion(root) ?? '', - events: Array.from(generator.relatedEventsGenerator(root)), - nextEvent: null, - }; - const tree = new Tree(entityIDSafeVersion(root) ?? '', { relatedEvents: events }); - const rendered = tree.render(); - expect(rendered.relatedEvents.nextEvent).toBeNull(); - expect(rendered.relatedEvents.events).toStrictEqual(events.events); - }); - }); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.ts index dd493d70ffcd3..26ac15e73759a 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/utils/tree.ts @@ -8,7 +8,6 @@ import _ from 'lodash'; import { SafeResolverEvent, ResolverNodeStats, - SafeResolverRelatedEvents, SafeResolverAncestry, SafeResolverTree, SafeResolverChildren, @@ -23,7 +22,6 @@ interface Node { } export interface Options { - relatedEvents?: SafeResolverRelatedEvents; ancestry?: SafeResolverAncestry; children?: SafeResolverChildren; relatedAlerts?: ResolverRelatedAlerts; @@ -44,7 +42,6 @@ export class Tree { this.tree = tree; this.cache.set(id, tree); - this.addRelatedEvents(options.relatedEvents); this.addAncestors(options.ancestry); this.addChildren(options.children); this.addRelatedAlerts(options.relatedAlerts); @@ -68,20 +65,6 @@ export class Tree { return [...this.cache.keys()]; } - /** - * Add related events for the tree's origin node. Related events cannot be added for other nodes. - * - * @param relatedEventsInfo is the related events and pagination information to add to the tree. - */ - private addRelatedEvents(relatedEventsInfo: SafeResolverRelatedEvents | undefined) { - if (!relatedEventsInfo) { - return; - } - - this.tree.relatedEvents.events = relatedEventsInfo.events; - this.tree.relatedEvents.nextEvent = relatedEventsInfo.nextEvent; - } - /** * Add alerts for the tree's origin node. Alerts cannot be added for other nodes. * diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts index b57486ee55ca4..0878c09cff500 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/events.ts @@ -5,10 +5,7 @@ */ import expect from '@kbn/expect'; import { eventIDSafeVersion } from '../../../../plugins/security_solution/common/endpoint/models/event'; -import { - ResolverPaginatedEvents, - SafeResolverRelatedEvents, -} from '../../../../plugins/security_solution/common/endpoint/types'; +import { ResolverPaginatedEvents } from '../../../../plugins/security_solution/common/endpoint/types'; import { FtrProviderContext } from '../../ftr_provider_context'; import { Tree, @@ -20,7 +17,6 @@ import { compareArrays } from './common'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const resolver = getService('resolverGenerator'); - const esArchiver = getService('esArchiver'); const relatedEventsToGen = [ { category: RelatedEventCategory.Driver, count: 2 }, @@ -44,308 +40,136 @@ export default function ({ getService }: FtrProviderContext) { ancestryArraySize: 2, }; - describe('event routes', () => { - describe('related events route', () => { - before(async () => { - await esArchiver.load('endpoint/resolver/api_feature'); - resolverTrees = await resolver.createTrees(treeOptions); - // we only requested a single alert so there's only 1 tree - tree = resolverTrees.trees[0]; - }); - after(async () => { - await resolver.deleteData(resolverTrees); - await esArchiver.unload('endpoint/resolver/api_feature'); - }); - - describe('legacy events', () => { - const endpointID = '5a0c957f-b8e7-4538-965e-57e8bb86ad3a'; - const entityID = '94042'; - const cursor = 'eyJ0aW1lc3RhbXAiOjE1ODE0NTYyNTUwMDAsImV2ZW50SUQiOiI5NDA0MyJ9'; - - it('should return details for the root node', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${entityID}/events?legacyEndpointID=${endpointID}`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.events.length).to.eql(1); - expect(body.entityID).to.eql(entityID); - expect(body.nextEvent).to.eql(null); - }); - - it('returns no values when there is no more data', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - // after is set to the document id of the last event so there shouldn't be any more after it - .post( - `/api/endpoint/resolver/${entityID}/events?legacyEndpointID=${endpointID}&afterEvent=${cursor}` - ) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.events).be.empty(); - expect(body.entityID).to.eql(entityID); - expect(body.nextEvent).to.eql(null); - }); - - it('should return the first page of information when the cursor is invalid', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post( - `/api/endpoint/resolver/${entityID}/events?legacyEndpointID=${endpointID}&afterEvent=blah` - ) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.entityID).to.eql(entityID); - expect(body.nextEvent).to.eql(null); - }); - - it('should return no results for an invalid endpoint ID', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${entityID}/events?legacyEndpointID=foo`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.nextEvent).to.eql(null); - expect(body.entityID).to.eql(entityID); - expect(body.events).to.be.empty(); - }); - - it('should error on invalid pagination values', async () => { - await supertest - .post(`/api/endpoint/resolver/${entityID}/events?events=0`) - .set('kbn-xsrf', 'xxx') - .expect(400); - await supertest - .post(`/api/endpoint/resolver/${entityID}/events?events=20000`) - .set('kbn-xsrf', 'xxx') - .expect(400); - await supertest - .post(`/api/endpoint/resolver/${entityID}/events?events=-1`) - .set('kbn-xsrf', 'xxx') - .expect(400); - }); - }); - - describe('endpoint events', () => { - it('should not find any events', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/5555/events`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.nextEvent).to.eql(null); - expect(body.events).to.be.empty(); - }); - - it('should return details for the root node', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${tree.origin.id}/events`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.events.length).to.eql(4); - compareArrays(tree.origin.relatedEvents, body.events, true); - expect(body.nextEvent).to.eql(null); - }); - - it('should allow for the events to be filtered', async () => { - const filter = `event.category:"${RelatedEventCategory.Driver}"`; - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${tree.origin.id}/events`) - .set('kbn-xsrf', 'xxx') - .send({ - filter, - }) - .expect(200); - expect(body.events.length).to.eql(2); - compareArrays(tree.origin.relatedEvents, body.events); - expect(body.nextEvent).to.eql(null); - for (const event of body.events) { - expect(event.event?.category).to.be(RelatedEventCategory.Driver); - } - }); - - it('should return paginated results for the root node', async () => { - let { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${tree.origin.id}/events?events=2`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.events.length).to.eql(2); - compareArrays(tree.origin.relatedEvents, body.events); - expect(body.nextEvent).not.to.eql(null); - - ({ body } = await supertest - .post( - `/api/endpoint/resolver/${tree.origin.id}/events?events=2&afterEvent=${body.nextEvent}` - ) - .set('kbn-xsrf', 'xxx') - .expect(200)); - expect(body.events.length).to.eql(2); - compareArrays(tree.origin.relatedEvents, body.events); - expect(body.nextEvent).to.not.eql(null); - - ({ body } = await supertest - .post( - `/api/endpoint/resolver/${tree.origin.id}/events?events=2&afterEvent=${body.nextEvent}` - ) - .set('kbn-xsrf', 'xxx') - .expect(200)); - expect(body.events).to.be.empty(); - expect(body.nextEvent).to.eql(null); - }); - - it('should return the first page of information when the cursor is invalid', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${tree.origin.id}/events?afterEvent=blah`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.events.length).to.eql(4); - compareArrays(tree.origin.relatedEvents, body.events, true); - expect(body.nextEvent).to.eql(null); - }); - - it('should sort the events in descending order', async () => { - const { body }: { body: SafeResolverRelatedEvents } = await supertest - .post(`/api/endpoint/resolver/${tree.origin.id}/events`) - .set('kbn-xsrf', 'xxx') - .expect(200); - expect(body.events.length).to.eql(4); - // these events are created in the order they are defined in the array so the newest one is - // the last element in the array so let's reverse it - const relatedEvents = tree.origin.relatedEvents.reverse(); - for (let i = 0; i < body.events.length; i++) { - expect(body.events[i].event?.category).to.equal(relatedEvents[i].event?.category); - expect(eventIDSafeVersion(body.events[i])).to.equal(relatedEvents[i].event?.id); - } - }); - }); + describe('event route', () => { + let entityIDFilter: string | undefined; + before(async () => { + resolverTrees = await resolver.createTrees(treeOptions); + // we only requested a single alert so there's only 1 tree + tree = resolverTrees.trees[0]; + entityIDFilter = `process.entity_id:"${tree.origin.id}" and not event.category:"process"`; + }); + after(async () => { + await resolver.deleteData(resolverTrees); }); - describe('kql events route', () => { - let entityIDFilter: string | undefined; - before(async () => { - resolverTrees = await resolver.createTrees(treeOptions); - // we only requested a single alert so there's only 1 tree - tree = resolverTrees.trees[0]; - entityIDFilter = `process.entity_id:"${tree.origin.id}" and not event.category:"process"`; - }); - after(async () => { - await resolver.deleteData(resolverTrees); - }); - - it('should filter events by event.id', async () => { - const { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: `event.id:"${tree.origin.relatedEvents[0]?.event?.id}"`, - }) - .expect(200); - expect(body.events.length).to.eql(1); - expect(tree.origin.relatedEvents[0]?.event?.id).to.eql(body.events[0].event?.id); - expect(body.nextEvent).to.eql(null); - }); - - it('should not find any events when given an invalid entity id', async () => { - const { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: 'process.entity_id:"5555"', - }) - .expect(200); - expect(body.nextEvent).to.eql(null); - expect(body.events).to.be.empty(); - }); - - it('should return related events for the root node', async () => { - const { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: entityIDFilter, - }) - .expect(200); - expect(body.events.length).to.eql(4); - compareArrays(tree.origin.relatedEvents, body.events, true); - expect(body.nextEvent).to.eql(null); - }); + it('should filter events by event.id', async () => { + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: `event.id:"${tree.origin.relatedEvents[0]?.event?.id}"`, + }) + .expect(200); + expect(body.events.length).to.eql(1); + expect(tree.origin.relatedEvents[0]?.event?.id).to.eql(body.events[0].event?.id); + expect(body.nextEvent).to.eql(null); + }); - it('should allow for the events to be filtered', async () => { - const filter = `event.category:"${RelatedEventCategory.Driver}" and ${entityIDFilter}`; - const { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') - .send({ - filter, - }) - .expect(200); - expect(body.events.length).to.eql(2); - compareArrays(tree.origin.relatedEvents, body.events); - expect(body.nextEvent).to.eql(null); - for (const event of body.events) { - expect(event.event?.category).to.be(RelatedEventCategory.Driver); - } - }); + it('should not find any events when given an invalid entity id', async () => { + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: 'process.entity_id:"5555"', + }) + .expect(200); + expect(body.nextEvent).to.eql(null); + expect(body.events).to.be.empty(); + }); - it('should return paginated results for the root node', async () => { - let { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events?limit=2`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: entityIDFilter, - }) - .expect(200); - expect(body.events.length).to.eql(2); - compareArrays(tree.origin.relatedEvents, body.events); - expect(body.nextEvent).not.to.eql(null); + it('should return related events for the root node', async () => { + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: entityIDFilter, + }) + .expect(200); + expect(body.events.length).to.eql(4); + compareArrays(tree.origin.relatedEvents, body.events, true); + expect(body.nextEvent).to.eql(null); + }); - ({ body } = await supertest - .post(`/api/endpoint/resolver/events?limit=2&afterEvent=${body.nextEvent}`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: entityIDFilter, - }) - .expect(200)); - expect(body.events.length).to.eql(2); - compareArrays(tree.origin.relatedEvents, body.events); - expect(body.nextEvent).to.not.eql(null); + it('should allow for the events to be filtered', async () => { + const filter = `event.category:"${RelatedEventCategory.Driver}" and ${entityIDFilter}`; + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events`) + .set('kbn-xsrf', 'xxx') + .send({ + filter, + }) + .expect(200); + expect(body.events.length).to.eql(2); + compareArrays(tree.origin.relatedEvents, body.events); + expect(body.nextEvent).to.eql(null); + for (const event of body.events) { + expect(event.event?.category).to.be(RelatedEventCategory.Driver); + } + }); - ({ body } = await supertest - .post(`/api/endpoint/resolver/events?limit=2&afterEvent=${body.nextEvent}`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: entityIDFilter, - }) - .expect(200)); - expect(body.events).to.be.empty(); - expect(body.nextEvent).to.eql(null); - }); + it('should return paginated results for the root node', async () => { + let { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events?limit=2`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: entityIDFilter, + }) + .expect(200); + expect(body.events.length).to.eql(2); + compareArrays(tree.origin.relatedEvents, body.events); + expect(body.nextEvent).not.to.eql(null); + + ({ body } = await supertest + .post(`/api/endpoint/resolver/events?limit=2&afterEvent=${body.nextEvent}`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: entityIDFilter, + }) + .expect(200)); + expect(body.events.length).to.eql(2); + compareArrays(tree.origin.relatedEvents, body.events); + expect(body.nextEvent).to.not.eql(null); + + ({ body } = await supertest + .post(`/api/endpoint/resolver/events?limit=2&afterEvent=${body.nextEvent}`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: entityIDFilter, + }) + .expect(200)); + expect(body.events).to.be.empty(); + expect(body.nextEvent).to.eql(null); + }); - it('should return the first page of information when the cursor is invalid', async () => { - const { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events?afterEvent=blah`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: entityIDFilter, - }) - .expect(200); - expect(body.events.length).to.eql(4); - compareArrays(tree.origin.relatedEvents, body.events, true); - expect(body.nextEvent).to.eql(null); - }); + it('should return the first page of information when the cursor is invalid', async () => { + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events?afterEvent=blah`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: entityIDFilter, + }) + .expect(200); + expect(body.events.length).to.eql(4); + compareArrays(tree.origin.relatedEvents, body.events, true); + expect(body.nextEvent).to.eql(null); + }); - it('should sort the events in descending order', async () => { - const { body }: { body: ResolverPaginatedEvents } = await supertest - .post(`/api/endpoint/resolver/events`) - .set('kbn-xsrf', 'xxx') - .send({ - filter: entityIDFilter, - }) - .expect(200); - expect(body.events.length).to.eql(4); - // these events are created in the order they are defined in the array so the newest one is - // the last element in the array so let's reverse it - const relatedEvents = tree.origin.relatedEvents.reverse(); - for (let i = 0; i < body.events.length; i++) { - expect(body.events[i].event?.category).to.equal(relatedEvents[i].event?.category); - expect(eventIDSafeVersion(body.events[i])).to.equal(relatedEvents[i].event?.id); - } - }); + it('should sort the events in descending order', async () => { + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: entityIDFilter, + }) + .expect(200); + expect(body.events.length).to.eql(4); + // these events are created in the order they are defined in the array so the newest one is + // the last element in the array so let's reverse it + const relatedEvents = tree.origin.relatedEvents.reverse(); + for (let i = 0; i < body.events.length; i++) { + expect(body.events[i].event?.category).to.equal(relatedEvents[i].event?.category); + expect(eventIDSafeVersion(body.events[i])).to.equal(relatedEvents[i].event?.id); + } }); }); } diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts index 837af6a940f5c..7a95bf7bab883 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/resolver/tree.ts @@ -340,10 +340,8 @@ export default function ({ getService }: FtrProviderContext) { .get(`/api/endpoint/resolver/93933?legacyEndpointID=${endpointID}`) .expect(200); expect(body.ancestry.nextAncestor).to.equal(null); - expect(body.relatedEvents.nextEvent).to.equal(null); expect(body.children.nextChild).to.equal(null); expect(body.children.childNodes.length).to.equal(0); - expect(body.relatedEvents.events.length).to.equal(0); expect(body.lifecycle.length).to.equal(2); }); }); @@ -365,9 +363,6 @@ export default function ({ getService }: FtrProviderContext) { verifyAncestry(body.ancestry.ancestors, tree, true); verifyLifecycleStats(body.ancestry.ancestors, relatedEventsToGen, relatedAlerts); - expect(body.relatedEvents.nextEvent).to.equal(null); - compareArrays(tree.origin.relatedEvents, body.relatedEvents.events, true); - expect(body.relatedAlerts.nextAlert).to.equal(null); compareArrays(tree.origin.relatedAlerts, body.relatedAlerts.alerts, true); From 3f3589d74bbae5b6421d0a3dea57658abc31acee Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 12 Oct 2020 20:11:20 +0200 Subject: [PATCH 07/85] [Discover] Loading spinner cleanup (#79819) --- .../public/application/components/discover_legacy.tsx | 7 +------ .../components/loading_spinner/loading_spinner.tsx | 4 ++-- test/functional/page_objects/discover_page.ts | 7 +++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/plugins/discover/public/application/components/discover_legacy.tsx b/src/plugins/discover/public/application/components/discover_legacy.tsx index de1faaf9fc19d..139b2ca69d9e4 100644 --- a/src/plugins/discover/public/application/components/discover_legacy.tsx +++ b/src/plugins/discover/public/application/components/discover_legacy.tsx @@ -211,12 +211,7 @@ export function DiscoverLegacy({ /> )} {resultState === 'uninitialized' && } - {/* @TODO: Solved in the Angular way to satisfy functional test - should be improved*/} - -
- -
-
+ {resultState === 'loading' && } {resultState === 'ready' && (
diff --git a/src/plugins/discover/public/application/components/loading_spinner/loading_spinner.tsx b/src/plugins/discover/public/application/components/loading_spinner/loading_spinner.tsx index 4e1754638d479..e3cc396783628 100644 --- a/src/plugins/discover/public/application/components/loading_spinner/loading_spinner.tsx +++ b/src/plugins/discover/public/application/components/loading_spinner/loading_spinner.tsx @@ -22,7 +22,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; export function LoadingSpinner() { return ( - <> +

@@ -30,6 +30,6 @@ export function LoadingSpinner() { - +

); } diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index e522f41952a49..60532c81493f9 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -27,10 +27,10 @@ export function DiscoverPageProvider({ getService, getPageObjects }: FtrProvider const { header } = getPageObjects(['header']); const browser = getService('browser'); const globalNav = getService('globalNav'); - const config = getService('config'); - const defaultFindTimeout = config.get('timeouts.find'); const elasticChart = getService('elasticChart'); const docTable = getService('docTable'); + const config = getService('config'); + const defaultFindTimeout = config.get('timeouts.find'); class DiscoverPage { public async getChartTimespan() { @@ -84,8 +84,7 @@ export function DiscoverPageProvider({ getService, getPageObjects }: FtrProvider } public async waitUntilSearchingHasFinished() { - const spinner = await testSubjects.find('loadingSpinner'); - await find.waitForElementHidden(spinner, defaultFindTimeout * 10); + await testSubjects.missingOrFail('loadingSpinner', { timeout: defaultFindTimeout * 10 }); } public async getColumnHeaders() { From 51e93dfe646a8449d6ece350e4407c21c5863e41 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 12 Oct 2020 14:14:11 -0400 Subject: [PATCH 08/85] Fix layout and remove title for add alert popover. (#77633) Co-authored-by: Elastic Machine Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/overview/alerts/toggle_alert_flyout_button.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx index 067972a452f27..bebc232b968d9 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx @@ -93,7 +93,6 @@ export const ToggleAlertFlyoutButtonComponent: React.FC = ({ panels = [ { id: ALERT_CONTEXT_MAIN_PANEL_ID, - title: 'main panel', items: [...selectionItems, managementContextItem], }, ]; @@ -101,7 +100,6 @@ export const ToggleAlertFlyoutButtonComponent: React.FC = ({ panels = [ { id: ALERT_CONTEXT_MAIN_PANEL_ID, - title: 'main panel', items: [ { 'aria-label': ToggleFlyoutTranslations.openAlertContextPanelAriaLabel, @@ -140,6 +138,7 @@ export const ToggleAlertFlyoutButtonComponent: React.FC = ({ closePopover={() => setIsOpen(false)} isOpen={isOpen} ownFocus + panelPaddingSize="none" > From a6b32ab0a232cb6ccc6928d46bd6ac3b0026b7a1 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Mon, 12 Oct 2020 20:16:51 +0200 Subject: [PATCH 09/85] [APM] Catch health status error from ML (#80131) Closes #80119. --- .../get_services/get_services_items.ts | 8 +- .../server/lib/services/get_services/index.ts | 4 + .../apm/server/lib/services/queries.test.ts | 6 +- x-pack/plugins/apm/server/routes/services.ts | 6 +- .../common/authentication.ts | 13 ++++ .../test/apm_api_integration/common/config.ts | 4 + .../__snapshots__/service_maps.snap | 2 +- .../trial/tests/service_maps/service_maps.ts | 68 +++++++++++------ .../trial/tests/services/top_services.ts | 74 +++++++++++++------ 9 files changed, 136 insertions(+), 49 deletions(-) diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts index 092485c46fb08..4cb0c4c750dd1 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts @@ -3,6 +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 { Logger } from '@kbn/logging'; import { joinByKey } from '../../../../common/utils/join_by_key'; import { PromiseReturnType } from '../../../../typings/common'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; @@ -23,9 +24,11 @@ export type ServicesItemsProjection = ReturnType; export async function getServicesItems({ setup, searchAggregatedTransactions, + logger, }: { setup: ServicesItemsSetup; searchAggregatedTransactions: boolean; + logger: Logger; }) { const params = { projection: getServicesProjection({ @@ -49,7 +52,10 @@ export async function getServicesItems({ getTransactionRates(params), getTransactionErrorRates(params), getEnvironments(params), - getHealthStatuses(params, setup.uiFilters.environment), + getHealthStatuses(params, setup.uiFilters.environment).catch((err) => { + logger.error(err); + return []; + }), ]); const allMetrics = [ diff --git a/x-pack/plugins/apm/server/lib/services/get_services/index.ts b/x-pack/plugins/apm/server/lib/services/get_services/index.ts index 04744a9c791bb..5f39d6c836930 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/index.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/index.ts @@ -5,6 +5,7 @@ */ import { isEmpty } from 'lodash'; +import { Logger } from '@kbn/logging'; import { PromiseReturnType } from '../../../../typings/common'; import { Setup, SetupTimeRange } from '../../helpers/setup_request'; import { hasHistoricalAgentData } from './has_historical_agent_data'; @@ -16,14 +17,17 @@ export type ServiceListAPIResponse = PromiseReturnType; export async function getServices({ setup, searchAggregatedTransactions, + logger, }: { setup: Setup & SetupTimeRange; searchAggregatedTransactions: boolean; + logger: Logger; }) { const [items, hasLegacyData] = await Promise.all([ getServicesItems({ setup, searchAggregatedTransactions, + logger, }), getLegacyDataStatus(setup), ]); diff --git a/x-pack/plugins/apm/server/lib/services/queries.test.ts b/x-pack/plugins/apm/server/lib/services/queries.test.ts index 11adbe894f779..8491f536342b8 100644 --- a/x-pack/plugins/apm/server/lib/services/queries.test.ts +++ b/x-pack/plugins/apm/server/lib/services/queries.test.ts @@ -47,7 +47,11 @@ describe('services queries', () => { it('fetches the service items', async () => { mock = await inspectSearchParams((setup) => - getServicesItems({ setup, searchAggregatedTransactions: false }) + getServicesItems({ + setup, + searchAggregatedTransactions: false, + logger: {} as any, + }) ); const allParams = mock.spy.mock.calls.map((call) => call[0]); diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts index 538ba3926c792..5673aa123b6aa 100644 --- a/x-pack/plugins/apm/server/routes/services.ts +++ b/x-pack/plugins/apm/server/routes/services.ts @@ -30,7 +30,11 @@ export const servicesRoute = createRoute(() => ({ setup ); - const services = await getServices({ setup, searchAggregatedTransactions }); + const services = await getServices({ + setup, + searchAggregatedTransactions, + logger: context.logger, + }); return services; }, diff --git a/x-pack/test/apm_api_integration/common/authentication.ts b/x-pack/test/apm_api_integration/common/authentication.ts index 5db456ee26107..6179c88916639 100644 --- a/x-pack/test/apm_api_integration/common/authentication.ts +++ b/x-pack/test/apm_api_integration/common/authentication.ts @@ -14,6 +14,7 @@ export enum ApmUser { apmReadUser = 'apm_read_user', apmWriteUser = 'apm_write_user', apmAnnotationsWriteUser = 'apm_annotations_write_user', + apmReadUserWithoutMlAccess = 'apm_read_user_without_ml_access', } const roles = { @@ -27,6 +28,15 @@ const roles = { }, ], }, + [ApmUser.apmReadUserWithoutMlAccess]: { + kibana: [ + { + base: [], + feature: { apm: ['read'] }, + spaces: ['*'], + }, + ], + }, [ApmUser.apmWriteUser]: { kibana: [ { @@ -63,6 +73,9 @@ const users = { [ApmUser.apmReadUser]: { roles: ['apm_user', ApmUser.apmReadUser], }, + [ApmUser.apmReadUserWithoutMlAccess]: { + roles: ['apm_user', ApmUser.apmReadUserWithoutMlAccess], + }, [ApmUser.apmWriteUser]: { roles: ['apm_user', ApmUser.apmWriteUser], }, diff --git a/x-pack/test/apm_api_integration/common/config.ts b/x-pack/test/apm_api_integration/common/config.ts index 5edf1bf23e594..db073cb967423 100644 --- a/x-pack/test/apm_api_integration/common/config.ts +++ b/x-pack/test/apm_api_integration/common/config.ts @@ -63,6 +63,10 @@ export function createTestConfig(settings: Settings) { servers.kibana, ApmUser.apmAnnotationsWriteUser ), + supertestAsApmReadUserWithoutMlAccess: supertestAsApmUser( + servers.kibana, + ApmUser.apmReadUserWithoutMlAccess + ), }, junit: { reportName: name, diff --git a/x-pack/test/apm_api_integration/trial/tests/service_maps/__snapshots__/service_maps.snap b/x-pack/test/apm_api_integration/trial/tests/service_maps/__snapshots__/service_maps.snap index 1249561a549bd..a7e6ae03b1bdc 100644 --- a/x-pack/test/apm_api_integration/trial/tests/service_maps/__snapshots__/service_maps.snap +++ b/x-pack/test/apm_api_integration/trial/tests/service_maps/__snapshots__/service_maps.snap @@ -1046,7 +1046,7 @@ Array [ ] `; -exports[`Service Maps with a trial license when there is data with anomalies returns the correct anomaly stats 3`] = ` +exports[`Service Maps with a trial license when there is data with anomalies with the default apm user returns the correct anomaly stats 3`] = ` Object { "elements": Array [ Object { diff --git a/x-pack/test/apm_api_integration/trial/tests/service_maps/service_maps.ts b/x-pack/test/apm_api_integration/trial/tests/service_maps/service_maps.ts index 6e7046ac0ba12..0cd91eb46a5e2 100644 --- a/x-pack/test/apm_api_integration/trial/tests/service_maps/service_maps.ts +++ b/x-pack/test/apm_api_integration/trial/tests/service_maps/service_maps.ts @@ -14,6 +14,8 @@ import { FtrProviderContext } from '../../../common/ftr_provider_context'; export default function serviceMapsApiTests({ getService }: FtrProviderContext) { const supertest = getService('supertest'); + const supertestAsApmReadUserWithoutMlAccess = getService('supertestAsApmReadUserWithoutMlAccess'); + const esArchiver = getService('esArchiver'); const archiveName = 'apm_8.0.0'; @@ -128,34 +130,35 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) before(() => esArchiver.load(archiveName)); after(() => esArchiver.unload(archiveName)); - let response: PromiseReturnType; + describe('with the default apm user', () => { + let response: PromiseReturnType; - before(async () => { - response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`); - }); + before(async () => { + response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`); + }); - it('returns service map elements with anomaly stats', () => { - expect(response.status).to.be(200); - const dataWithAnomalies = response.body.elements.filter( - (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) - ); + it('returns service map elements with anomaly stats', () => { + expect(response.status).to.be(200); + const dataWithAnomalies = response.body.elements.filter( + (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) + ); - expect(dataWithAnomalies).to.not.empty(); + expect(dataWithAnomalies).to.not.empty(); - dataWithAnomalies.forEach(({ data }: any) => { - expect( - Object.values(data.serviceAnomalyStats).filter((value) => isEmpty(value)) - ).to.not.empty(); + dataWithAnomalies.forEach(({ data }: any) => { + expect( + Object.values(data.serviceAnomalyStats).filter((value) => isEmpty(value)) + ).to.not.empty(); + }); }); - }); - it('returns the correct anomaly stats', () => { - const dataWithAnomalies = response.body.elements.filter( - (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) - ); + it('returns the correct anomaly stats', () => { + const dataWithAnomalies = response.body.elements.filter( + (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) + ); - expectSnapshot(dataWithAnomalies.length).toMatchInline(`5`); - expectSnapshot(dataWithAnomalies.slice(0, 3)).toMatchInline(` + expectSnapshot(dataWithAnomalies.length).toMatchInline(`5`); + expectSnapshot(dataWithAnomalies.slice(0, 3)).toMatchInline(` Array [ Object { "data": Object { @@ -203,7 +206,28 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) ] `); - expectSnapshot(response.body).toMatch(); + expectSnapshot(response.body).toMatch(); + }); + }); + + describe('with a user that does not have access to ML', () => { + let response: PromiseReturnType; + + before(async () => { + response = await supertestAsApmReadUserWithoutMlAccess.get( + `/api/apm/service-map?start=${start}&end=${end}` + ); + }); + + it('returns service map elements without anomaly stats', () => { + expect(response.status).to.be(200); + + const dataWithAnomalies = response.body.elements.filter( + (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) + ); + + expect(dataWithAnomalies).to.be.empty(); + }); }); }); }); diff --git a/x-pack/test/apm_api_integration/trial/tests/services/top_services.ts b/x-pack/test/apm_api_integration/trial/tests/services/top_services.ts index c23c26f504a6c..6fd5e7e0c3ea7 100644 --- a/x-pack/test/apm_api_integration/trial/tests/services/top_services.ts +++ b/x-pack/test/apm_api_integration/trial/tests/services/top_services.ts @@ -12,6 +12,7 @@ import archives_metadata from '../../../common/archives_metadata'; export default function ApiTest({ getService }: FtrProviderContext) { const supertest = getService('supertest'); + const supertestAsApmReadUserWithoutMlAccess = getService('supertestAsApmReadUserWithoutMlAccess'); const esArchiver = getService('esArchiver'); const archiveName = 'apm_8.0.0'; @@ -29,35 +30,36 @@ export default function ApiTest({ getService }: FtrProviderContext) { before(() => esArchiver.load(archiveName)); after(() => esArchiver.unload(archiveName)); - describe('and fetching a list of services', () => { - let response: PromiseReturnType; - before(async () => { - response = await supertest.get( - `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` - ); - }); + describe('with the default APM read user', () => { + describe('and fetching a list of services', () => { + let response: PromiseReturnType; + before(async () => { + response = await supertest.get( + `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + }); - it('the response is successful', () => { - expect(response.status).to.eql(200); - }); + it('the response is successful', () => { + expect(response.status).to.eql(200); + }); - it('there is at least one service', () => { - expect(response.body.items.length).to.be.greaterThan(0); - }); + it('there is at least one service', () => { + expect(response.body.items.length).to.be.greaterThan(0); + }); - it('some items have a health status set', () => { - // Under the assumption that the loaded archive has - // at least one APM ML job, and the time range is longer - // than 15m, at least one items should have a health status - // set. Note that we currently have a bug where healthy - // services report as unknown (so without any health status): - // https://github.com/elastic/kibana/issues/77083 + it('some items have a health status set', () => { + // Under the assumption that the loaded archive has + // at least one APM ML job, and the time range is longer + // than 15m, at least one items should have a health status + // set. Note that we currently have a bug where healthy + // services report as unknown (so without any health status): + // https://github.com/elastic/kibana/issues/77083 - const healthStatuses = response.body.items.map((item: any) => item.healthStatus); + const healthStatuses = response.body.items.map((item: any) => item.healthStatus); - expect(healthStatuses.filter(Boolean).length).to.be.greaterThan(0); + expect(healthStatuses.filter(Boolean).length).to.be.greaterThan(0); - expectSnapshot(healthStatuses).toMatchInline(` + expectSnapshot(healthStatuses).toMatchInline(` Array [ "healthy", undefined, @@ -69,6 +71,32 @@ export default function ApiTest({ getService }: FtrProviderContext) { "healthy", ] `); + }); + }); + }); + + describe('with a user that does not have access to ML', () => { + let response: PromiseReturnType; + before(async () => { + response = await supertestAsApmReadUserWithoutMlAccess.get( + `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + }); + + it('the response is successful', () => { + expect(response.status).to.eql(200); + }); + + it('there is at least one service', () => { + expect(response.body.items.length).to.be.greaterThan(0); + }); + + it('contains no health statuses', () => { + const definedHealthStatuses = response.body.items + .map((item: any) => item.healthStatus) + .filter(Boolean); + + expect(definedHealthStatuses.length).to.be(0); }); }); }); From d45bedc8484df4635788058e7df3515e51518708 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 12 Oct 2020 11:17:55 -0700 Subject: [PATCH 10/85] [DOCS] Redirects ILM docs to Elasticsearch reference (#79798) * [DOCS] Redirects ILM docs to Elasticsearch reference * Update docs/redirects.asciidoc Co-authored-by: James Rodewig <40268737+jrodewig@users.noreply.github.com> * Update docs/redirects.asciidoc Co-authored-by: James Rodewig <40268737+jrodewig@users.noreply.github.com> Co-authored-by: James Rodewig <40268737+jrodewig@users.noreply.github.com> --- .../index-lifecycle-policies-create.png | Bin 148891 -> 0 bytes .../index_lifecycle_policies_options.png | Bin 92700 -> 0 bytes .../images/index_management_add_policy.png | Bin 193904 -> 0 bytes .../add-policy-to-index.asciidoc | 17 ---- .../create-policy.asciidoc | 93 ------------------ .../intro-to-lifecycle-policies.asciidoc | 30 ------ .../manage-policy.asciidoc | 34 ------- docs/redirects.asciidoc | 25 +++++ docs/user/management.asciidoc | 10 +- 9 files changed, 26 insertions(+), 183 deletions(-) delete mode 100644 docs/management/images/index-lifecycle-policies-create.png delete mode 100644 docs/management/images/index_lifecycle_policies_options.png delete mode 100644 docs/management/images/index_management_add_policy.png delete mode 100644 docs/management/index-lifecycle-policies/add-policy-to-index.asciidoc delete mode 100644 docs/management/index-lifecycle-policies/create-policy.asciidoc delete mode 100644 docs/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc delete mode 100644 docs/management/index-lifecycle-policies/manage-policy.asciidoc diff --git a/docs/management/images/index-lifecycle-policies-create.png b/docs/management/images/index-lifecycle-policies-create.png deleted file mode 100644 index f6d86fa9b4ea5a283fdcffbf15aa91470e22749b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148891 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 diff --git a/docs/management/images/index_lifecycle_policies_options.png b/docs/management/images/index_lifecycle_policies_options.png deleted file mode 100644 index 184188be181e8227bf277748a6c68cf11511c426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92700 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 Data > Index Management*. -This page lists your -{es} indices, which you can filter by lifecycle status and lifecycle phase. - -To add a policy, select the index name and then select *Manage Index > Add lifecycle policy*. -You’ll see the policy name, the phase the index is in, the current -action, and if any errors occurred performing that action. - -To remove a policy from an index, select *Manage Index > Remove lifecycle policy*. - -[role="screenshot"] -image::images/index_management_add_policy.png[][UI for adding a policy to an index] diff --git a/docs/management/index-lifecycle-policies/create-policy.asciidoc b/docs/management/index-lifecycle-policies/create-policy.asciidoc deleted file mode 100644 index 7849ef6b92054..0000000000000 --- a/docs/management/index-lifecycle-policies/create-policy.asciidoc +++ /dev/null @@ -1,93 +0,0 @@ -[role="xpack"] -[[creating-index-lifecycle-policies]] -=== Creating an index lifecycle policy - -An index lifecycle policy enables you to define rules over when to perform -certain actions, such as a rollover or force merge, on an index. Index lifecycle -management automates execution of those actions at the right time. - -When you create an index lifecycle policy, consider the tradeoffs between -performance and availability. As you move your index through the lifecycle, -you’re likely moving your data to less performant hardware and reducing the -number of shards and replicas. It’s important to ensure that the index -continues to have enough replicas to prevent data loss in the event of failures. - -*Index Lifecycle Policies* is automatically enabled in {kib}. Open the menu, then go to -*Stack Management > {es} > Index Lifecycle Policies*. - -NOTE: If you don’t want to use this feature, you can disable it by setting -`xpack.ilm.enabled` to false in your `kibana.yml` configuration file. If you -disable *Index Management*, then *Index Lifecycle Policies* is also disabled. - -[role="screenshot"] -image::images/index-lifecycle-policies-create.png[][UI for creating an index lifecycle policy] - -==== Defining the phases of the index lifecycle - -You can define up to four phases in the index lifecycle. For each phase, you -can enable actions to optimize performance for that phase. - -The four phases in the index lifecycle are: - -* *Hot.* The index is actively being queried and written to. You can -roll over to a new index when the -original index reaches a specified size, document count, or age. When a rollover occurs, a new -index is created, added to the index alias, and designated as the new “hot” -index. You can still query the previous indices, but you only ever write to -the “hot” index. See <>. - -* *Warm.* The index is typically searched at a lower rate than when the data is -hot. The index is not used for storing new data, but might occasionally add -late-arriving data, for example, from a Beat with a network problem that's now fixed. -You can optionally shrink the number replicas and move the shards to a -different set of nodes with smaller or less performant hardware. You can also -reduce the number of primary shards and force merge the index into -smaller {ref}/indices-segments.html[segments]. - -* *Cold.* The index is no longer being updated and is seldom queried, but is -still searchable. If you have a big deployment, you can move it to even -less performant hardware. You might also reduce the number of replicas because -you expect the data to be queried less frequently. To keep the index searchable -for a longer period, and reduce the hardware requirements, you can use the -{ref}/frozen-indices.html[freeze action]. Queries are slower on a frozen index because the index is -reloaded from the disk to RAM on demand. - -* *Delete.* The index is no longer relevant. You can define when it is safe to -delete it. - -The index lifecycle always includes an active hot phase. The warm, cold, and -delete phases are optional. For example, you might define all four phases for -one policy and only a hot and delete phase for another. See {ref}/_actions.html[Actions] -for more information on the actions available in each phase. - -[[setting-a-rollover-action]] -==== Setting a rollover action - -The {ref}/indices-rollover-index.html[rollover] action enables you to automatically roll over to a new index based -on the index size, document count, or age. Rolling over to a new index based on -these criteria is preferable to time-based rollovers. Rolling over at an arbitrary -time often results in many small indices, which can have a negative impact on performance and resource usage. - -When you create an index lifecycle policy, the rollover action is enabled -by default. The default size for triggering the rollover is 50 gigabytes, and -the default age is 30 days. The rollover occurs when any of the criteria are met. - -With the rollover action enabled, you can move to the warm phase on rollover or you can -time the move for a specified number of hours or days after the rollover. The -move to the cold and delete phases is based on the time from the rollover. - -If you are using daily indices (created by Logstash or another client) and you -want to use the index lifecycle policy to manage aging data, you can -disable the rollover action in the hot phase. You can then -transition to the warm, cold, and delete phases based on the time of index creation. - -==== Setting the index priority - -For the hot, warm, and cold phases, you can set a priority for recovering -indices after a node restart. Indices with higher priorities are recovered -before indices with lower priorities. By default, the index priority is set to -100 in the hot phase, 50 in the warm phase, and 0 in the cold phase. -If the cold phase of one index has data that -is more important than the data in the hot phase of another, you might increase -the index priority in the cold phase. See -{ref}/recovery-prioritization.html[Index recovery prioritization]. diff --git a/docs/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc b/docs/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc deleted file mode 100644 index ba1d79710de05..0000000000000 --- a/docs/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc +++ /dev/null @@ -1,30 +0,0 @@ -[role="xpack"] -[[index-lifecycle-policies]] -== Index Lifecycle Policies - -If you're working with time series data, you don't want to continually dump -everything into a single index. Instead, you might periodically roll over the -data to a new index to keep it from growing so big it's slow and expensive. -As the index ages and you query it less frequently, you’ll likely move it to -less expensive hardware and reduce the number of shards and replicas. - -To automatically move an index through its lifecycle, you can create a policy -to define actions to perform on the index as it ages. Index lifecycle policies -are especially useful when working with {beats-ref}/beats-reference.html[Beats] -data shippers, which continually -send operational data, such as metrics and logs, to Elasticsearch. You can -automate a rollover to a new index when the existing index reaches a specified -size or age. This ensures that all indices have a similar size instead of having -daily indices where size can vary based on the number of Beats and the number -of events sent. - -{kib}’s *Index Lifecycle Policies* walks you through the process for creating -and configuring a policy. Before using this feature, you should be familiar -with index lifecycle management: - -* For an introduction, refer to -{ref}/getting-started-index-lifecycle-management.html[Getting started with index -lifecycle management]. -* To dig into the concepts and technical details, see -{ref}/index-lifecycle-management.html[Managing the index lifecycle]. -* To check out the APIs, see {ref}/index-lifecycle-management-api.html[Index lifecycle management API]. diff --git a/docs/management/index-lifecycle-policies/manage-policy.asciidoc b/docs/management/index-lifecycle-policies/manage-policy.asciidoc deleted file mode 100644 index 8e2dc96de4b99..0000000000000 --- a/docs/management/index-lifecycle-policies/manage-policy.asciidoc +++ /dev/null @@ -1,34 +0,0 @@ -[role="xpack"] -[[managing-index-lifecycle-policies]] -=== Managing index lifecycle policies - -Your configured policies appear on the *Index lifecycle policies* page. -You can update an existing index lifecycle policy to fix errors or change -strategies for newly created indices. To edit a policy, select its name. - -[role="screenshot"] -image::images/index_lifecycle_policies_options.png[][UI for viewing and editing an index lifecycle policy] - -In addition, you can: - -* *View indices linked to the policy.* This is important when editing a policy. -Any changes you make affect all indices attached to the policy. The settings -for the current phase are cached, so the update doesn’t affect that phase. This -prevents conflicts when you’re modifying a phase that is currently executing on -an index. The changes takes effect when the next phase in the index lifecycle begins. - -* *Add the policy to an index template.* When an index is automatically -created using the index template, the policy is applied. If the index is rolled -over, the policies for any matching index templates are applied to the newly -created index. For more information, see {ref}/indices-templates.html[Index templates]. - -* *Delete a policy.* You can’t delete a policy that is currently in use or -recover a deleted index. - -[float] -=== Required permissions - -The `manage_ilm` cluster privilege is required to access *Index lifecycle policies*. - -You can add these privileges in *Stack Management > Security > Roles*. - diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 92e02de89f181..d8c200450d7e5 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -113,8 +113,33 @@ This content has moved. See This content has moved. See {ref}/ccr-getting-started.html#ccr-getting-started-remote-cluster[Connect to a remote cluster]. +[role="exclude",id="adding-policy-to-index"] +== Adding a policy to an index + +This content has moved. See +{ref}/set-up-lifecycle-policy.html[Configure a lifecycle policy]. + +[role="exclude",id="creating-index-lifecycle-policies"] +== Creating an index lifecycle policy + +This content has moved. See +{ref}/set-up-lifecycle-policy.html[Configure a lifecycle policy]. + +[role="exclude",id="index-lifecycle-policies"] +== Index Lifecycle Policies + +This content has moved. See +{ref}/index-lifecycle-management.html[ILM: Manage the index lifecycle]. + +[role="exclude",id="managing-index-lifecycle-policies"] +== Managing index lifecycle policies + +This content has moved. See +{ref}/index-lifecycle-management.html[ILM: Manage the index lifecycle]. + [role="exclude",id="tutorial-define-index"] == Define your index patterns This content has moved. See <>. + diff --git a/docs/user/management.asciidoc b/docs/user/management.asciidoc index e0d550a15a907..c371aa695c475 100644 --- a/docs/user/management.asciidoc +++ b/docs/user/management.asciidoc @@ -40,7 +40,7 @@ a| <> flushing, and clearing the cache. Practicing good index management ensures that your data is stored cost effectively. -| <> +| {ref}/index-lifecycle-management.html[Index Lifecycle Policies] |Create a policy for defining the lifecycle of an index as it ages through the hot, warm, cold, and delete phases. Such policies help you control operation costs @@ -180,14 +180,6 @@ include::{kib-repo-dir}/management/alerting/connector-management.asciidoc[] include::{kib-repo-dir}/management/managing-beats.asciidoc[] -include::{kib-repo-dir}/management/index-lifecycle-policies/intro-to-lifecycle-policies.asciidoc[] - -include::{kib-repo-dir}/management/index-lifecycle-policies/create-policy.asciidoc[] - -include::{kib-repo-dir}/management/index-lifecycle-policies/manage-policy.asciidoc[] - -include::{kib-repo-dir}/management/index-lifecycle-policies/add-policy-to-index.asciidoc[] - include::{kib-repo-dir}/management/managing-indices.asciidoc[] include::{kib-repo-dir}/management/ingest-pipelines/ingest-pipelines.asciidoc[] From fbe341807716b9282ff404f4a4e8dfd49aa3c0ad Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 12 Oct 2020 11:24:40 -0700 Subject: [PATCH 11/85] [npm] remove canvas dep (#80185) Co-authored-by: spalger --- x-pack/package.json | 1 - yarn.lock | 88 ++++----------------------------------------- 2 files changed, 6 insertions(+), 83 deletions(-) diff --git a/x-pack/package.json b/x-pack/package.json index 941ebab2f3d65..67efa9f474c05 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -150,7 +150,6 @@ "base64url": "^3.0.1", "brace": "0.11.1", "broadcast-channel": "^3.0.3", - "canvas": "^2.6.1", "chalk": "^4.1.0", "chance": "1.0.18", "cheerio": "0.22.0", diff --git a/yarn.lock b/yarn.lock index eb12df7b50d72..7520f9f176d50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8114,15 +8114,6 @@ caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.300010 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001114.tgz#2e88119afb332ead5eaa330e332e951b1c4bfea9" integrity sha512-ml/zTsfNBM+T1+mjglWRPgVsu2L76GAaADKX5f4t0pbhttEp0WMawJsHDYlFkVZkoA+89uvBRrVrEE4oqenzXQ== -canvas@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.6.1.tgz#0d087dd4d60f5a5a9efa202757270abea8bef89e" - integrity sha512-S98rKsPcuhfTcYbtF53UIJhcbgIAK533d1kJKMwsMwAIFgfd58MOyxRud3kktlzWiEkFliaJtvyZCBtud/XVEA== - dependencies: - nan "^2.14.0" - node-pre-gyp "^0.11.0" - simple-get "^3.0.3" - capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -10607,11 +10598,6 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@2.X: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -15382,7 +15368,7 @@ icalendar@0.7.1: resolved "https://registry.yarnpkg.com/icalendar/-/icalendar-0.7.1.tgz#d0d3486795f8f1c5cf4f8cafac081b4b4e7a32ae" integrity sha1-0NNIZ5X48cXPT4yvrAgbS056Mq4= -iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -15440,13 +15426,6 @@ ignore-by-default@^1.0.1: resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - ignore@^3.1.2, ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -19912,15 +19891,6 @@ nearley@^2.7.10: randexp "0.4.6" semver "^5.4.1" -needle@^2.2.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.0.tgz#e6fc4b3cc6c25caed7554bd613a5cf0bac8c31c0" - integrity sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -20163,22 +20133,6 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-pre-gyp@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" - integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - node-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" @@ -20269,7 +20223,7 @@ nopt@^2.2.0: dependencies: abbrev "1" -nopt@^4.0.1, nopt@^4.0.3: +nopt@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== @@ -20347,13 +20301,6 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -npm-bundled@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" - integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== - dependencies: - npm-normalize-package-bin "^1.0.1" - npm-conf@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" @@ -20370,20 +20317,11 @@ npm-keyword@^5.0.0: got "^7.1.0" registry-url "^3.0.3" -npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: +npm-normalize-package-bin@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-packlist@^1.1.6: - version "1.4.8" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" - integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - npm-normalize-package-bin "^1.0.1" - npm-run-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" @@ -20421,7 +20359,7 @@ npmconf@^2.1.3: semver "2 || 3 || 4" uid-number "0.0.5" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -24608,7 +24546,7 @@ sass-resources-loader@^2.0.1: glob "^7.1.1" loader-utils "^1.0.4" -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -25048,20 +24986,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -simple-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" - integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= - -simple-get@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - simple-git@1.116.0: version "1.116.0" resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.116.0.tgz#ea6e533466f1e0152186e306e004d4eefa6e3e00" @@ -26370,7 +26294,7 @@ tar-stream@^2.0.0, tar-stream@^2.1.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@4.4.13, tar@^4: +tar@4.4.13: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== From 5e79523e305019db9fe2df3ab2801cec4ad4f8ab Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 12 Oct 2020 13:34:51 -0500 Subject: [PATCH 12/85] Re-enable transaction duration alert story (#80187) This was disabled in an earlier version of Storybook but works now. --- .../index.stories.tsx | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/x-pack/plugins/apm/public/components/alerting/TransactionDurationAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/alerting/TransactionDurationAlertTrigger/index.stories.tsx index 0816541865362..d20aae29fb8ce 100644 --- a/x-pack/plugins/apm/public/components/alerting/TransactionDurationAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/alerting/TransactionDurationAlertTrigger/index.stories.tsx @@ -3,9 +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 { storiesOf } from '@storybook/react'; + import { cloneDeep, merge } from 'lodash'; -import React from 'react'; +import React, { ComponentType } from 'react'; +import { MemoryRouter, Route } from 'react-router-dom'; import { TransactionDurationAlertTrigger } from '.'; import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; import { @@ -14,40 +15,55 @@ import { } from '../../../context/ApmPluginContext/MockApmPluginContext'; import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; -// Disabling this because we currently don't have a way to mock `useEnvironments` -// which is used by this component. Using the fetch-mock module should work, but -// our current storybook setup has core-js-related problems when trying to import -// it. -// storiesOf('app/TransactionDurationAlertTrigger', module).add('example', -// eslint-disable-next-line @typescript-eslint/no-unused-expressions -() => { +export default { + title: 'app/TransactionDurationAlertTrigger', + component: TransactionDurationAlertTrigger, + decorators: [ + (Story: ComponentType) => { + const contextMock = (merge(cloneDeep(mockApmPluginContextValue), { + core: { + http: { + get: (endpoint: string) => { + if (endpoint === '/api/apm/ui_filters/environments') { + return Promise.resolve(['production']); + } else { + return Promise.resolve({ + transactionTypes: ['request'], + }); + } + }, + }, + }, + }) as unknown) as ApmPluginContextValue; + + return ( +

+ ); + }, + ], +}; + +export function Example() { const params = { threshold: 1500, aggregationType: 'avg' as const, window: '5m', }; - - const contextMock = (merge(cloneDeep(mockApmPluginContextValue), { - core: { - http: { - get: () => { - return Promise.resolve({ transactionTypes: ['request'] }); - }, - }, - }, - }) as unknown) as ApmPluginContextValue; - return ( -
- - - undefined} - setAlertProperty={() => undefined} - /> - - -
+ undefined} + setAlertProperty={() => undefined} + /> ); -}; +} From 87715a21b013fd697b32d5b6885a88b858eee0a2 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Mon, 12 Oct 2020 13:40:25 -0600 Subject: [PATCH 13/85] [Security Solution] [Sourcerer] Jest beef up (#79907) --- .../components/sourcerer/index.test.tsx | 120 ++++++++- .../common/components/sourcerer/index.tsx | 27 +- .../common/containers/sourcerer/constants.ts | 7 - .../containers/sourcerer/index.test.tsx | 233 +++++------------- .../common/store/sourcerer/helpers.test.ts | 62 +++++ .../public/common/store/sourcerer/helpers.ts | 44 ++++ .../public/common/store/sourcerer/reducer.ts | 32 +-- .../detections/components/user_info/index.tsx | 2 +- 8 files changed, 303 insertions(+), 224 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/common/containers/sourcerer/constants.ts create mode 100644 x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.test.ts create mode 100644 x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts diff --git a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx index 2696b115cdc18..54e6e1cdc1185 100644 --- a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { SourcererScopeName } from '../../store/sourcerer/model'; -import { SourcererComponent } from './index'; +import { Sourcerer } from './index'; import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; import { sourcererActions, sourcererModel } from '../../store/sourcerer'; import { @@ -75,7 +75,7 @@ describe('Sourcerer component', () => { it('Mounts with all options selected', () => { const wrapper = mount( - + ); wrapper.find(`[data-test-subj="sourcerer-trigger"]`).first().simulate('click'); @@ -108,7 +108,7 @@ describe('Sourcerer component', () => { ); const wrapper = mount( - + ); wrapper.find(`[data-test-subj="sourcerer-trigger"]`).first().simulate('click'); @@ -119,12 +119,13 @@ describe('Sourcerer component', () => { it('onChange calls updateSourcererScopeIndices', async () => { const wrapper = mount( - + ); - expect(true).toBeTruthy(); wrapper.find(`[data-test-subj="sourcerer-trigger"]`).first().simulate('click'); - + expect( + wrapper.find(`[data-test-subj="sourcerer-popover"]`).first().prop('isOpen') + ).toBeTruthy(); await waitFor(() => { ((wrapper.find(EuiComboBox).props() as unknown) as { onChange: (a: EuiComboBoxOptionOption[]) => void; @@ -132,6 +133,7 @@ describe('Sourcerer component', () => { wrapper.update(); }); wrapper.find(`[data-test-subj="add-index"]`).first().simulate('click'); + expect(wrapper.find(`[data-test-subj="sourcerer-popover"]`).first().prop('isOpen')).toBeFalsy(); expect(mockDispatch).toHaveBeenCalledWith( sourcererActions.setSelectedIndexPatterns({ @@ -140,4 +142,110 @@ describe('Sourcerer component', () => { }) ); }); + it('resets to config index patterns', async () => { + store = createStore( + { + ...state, + sourcerer: { + ...state.sourcerer, + kibanaIndexPatterns: [{ id: '1234', title: 'auditbeat-*' }], + configIndexPatterns: ['packetbeat-*'], + }, + }, + SUB_PLUGINS_REDUCER, + apolloClientObservable, + kibanaObservable, + storage + ); + const wrapper = mount( + + + + ); + wrapper.find(`[data-test-subj="sourcerer-trigger"]`).first().simulate('click'); + expect(wrapper.find(`[data-test-subj="config-option"]`).first().exists()).toBeFalsy(); + wrapper + .find( + `[data-test-subj="indexPattern-switcher"] [title="packetbeat-*"] button.euiBadge__iconButton` + ) + .first() + .simulate('click'); + expect(wrapper.find(`[data-test-subj="config-option"]`).first().exists()).toBeTruthy(); + wrapper.find(`[data-test-subj="sourcerer-reset"]`).first().simulate('click'); + expect(wrapper.find(`[data-test-subj="config-option"]`).first().exists()).toBeFalsy(); + }); + it('returns index pattern options for kibanaIndexPatterns and configIndexPatterns', () => { + store = createStore( + { + ...state, + sourcerer: { + ...state.sourcerer, + kibanaIndexPatterns: [{ id: '1234', title: 'auditbeat-*' }], + configIndexPatterns: ['packetbeat-*'], + }, + }, + SUB_PLUGINS_REDUCER, + apolloClientObservable, + kibanaObservable, + storage + ); + const wrapper = mount( + + + + ); + wrapper.find(`[data-test-subj="sourcerer-trigger"]`).first().simulate('click'); + expect(wrapper.find(`[data-test-subj="config-option"]`).first().exists()).toBeFalsy(); + wrapper + .find( + `[data-test-subj="indexPattern-switcher"] [title="auditbeat-*"] button.euiBadge__iconButton` + ) + .first() + .simulate('click'); + wrapper.update(); + expect(wrapper.find(`[data-test-subj="kip-option"]`).first().text()).toEqual(' auditbeat-*'); + wrapper + .find( + `[data-test-subj="indexPattern-switcher"] [title="packetbeat-*"] button.euiBadge__iconButton` + ) + .first() + .simulate('click'); + wrapper.update(); + expect(wrapper.find(`[data-test-subj="config-option"]`).first().text()).toEqual('packetbeat-*'); + }); + it('combines index pattern options for kibanaIndexPatterns and configIndexPatterns', () => { + store = createStore( + { + ...state, + sourcerer: { + ...state.sourcerer, + kibanaIndexPatterns: [ + { id: '1234', title: 'auditbeat-*' }, + { id: '5678', title: 'packetbeat-*' }, + ], + configIndexPatterns: ['packetbeat-*'], + }, + }, + SUB_PLUGINS_REDUCER, + apolloClientObservable, + kibanaObservable, + storage + ); + const wrapper = mount( + + + + ); + wrapper.find(`[data-test-subj="sourcerer-trigger"]`).first().simulate('click'); + wrapper + .find( + `[data-test-subj="indexPattern-switcher"] [title="packetbeat-*"] button.euiBadge__iconButton` + ) + .first() + .simulate('click'); + wrapper.update(); + expect( + wrapper.find(`[title="packetbeat-*"] [data-test-subj="kip-option"]`).first().text() + ).toEqual(' packetbeat-*'); + }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx index 7a74f5bf2247f..182c1d5022d02 100644 --- a/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/sourcerer/index.tsx @@ -24,7 +24,6 @@ import { useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; import * as i18n from './translations'; -import { SOURCERER_FEATURE_FLAG_ON } from '../../containers/sourcerer/constants'; import { sourcererActions, sourcererModel } from '../../store/sourcerer'; import { State } from '../../store'; import { getSourcererScopeSelector, SourcererScopeSelector } from './selectors'; @@ -40,7 +39,7 @@ interface SourcererComponentProps { scope: sourcererModel.SourcererScopeName; } -export const SourcererComponent = React.memo(({ scope: scopeId }) => { +export const Sourcerer = React.memo(({ scope: scopeId }) => { const dispatch = useDispatch(); const sourcererScopeSelector = useMemo(getSourcererScopeSelector, []); const { configIndexPatterns, kibanaIndexPatterns, sourcererScope } = useSelector< @@ -71,17 +70,14 @@ export const SourcererComponent = React.memo(({ scope: ); const renderOption = useCallback( - (option) => { - const { value } = option; - if (kibanaIndexPatterns.some((kip) => kip.title === value)) { - return ( - <> - {value} - - ); - } - return <>{value}; - }, + ({ value }) => + kibanaIndexPatterns.some((kip) => kip.title === value) ? ( + + {value} + + ) : ( + {value} + ), [kibanaIndexPatterns] ); @@ -175,6 +171,7 @@ export const SourcererComponent = React.memo(({ scope: return ( (({ scope: ); }); -SourcererComponent.displayName = 'Sourcerer'; - -export const Sourcerer = SOURCERER_FEATURE_FLAG_ON ? SourcererComponent : () => null; +Sourcerer.displayName = 'Sourcerer'; diff --git a/x-pack/plugins/security_solution/public/common/containers/sourcerer/constants.ts b/x-pack/plugins/security_solution/public/common/containers/sourcerer/constants.ts deleted file mode 100644 index be3d074811032..0000000000000 --- a/x-pack/plugins/security_solution/public/common/containers/sourcerer/constants.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 const SOURCERER_FEATURE_FLAG_ON = true; diff --git a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx index 673db7af2b5e6..accfb38bc3dc1 100644 --- a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.test.tsx @@ -16,6 +16,10 @@ import { mockPatterns, mockSource } from './mocks'; import { RouteSpyState } from '../../utils/route/types'; import { SecurityPageName } from '../../../../common/constants'; import { createStore, State } from '../../store'; +import { + useUserInfo, + initialState as userInfoState, +} from '../../../detections/components/user_info'; import { apolloClientObservable, createSecuritySolutionStorageMock, @@ -23,6 +27,7 @@ import { mockGlobalState, SUB_PLUGINS_REDUCER, } from '../../mock'; +import { SourcererScopeName } from '../../store/sourcerer/model'; const mockSourceDefaults = mockSource; const mockRouteSpy: RouteSpyState = { @@ -33,6 +38,8 @@ const mockRouteSpy: RouteSpyState = { pathName: '/', }; const mockDispatch = jest.fn(); +const mockUseUserInfo = useUserInfo as jest.Mock; +jest.mock('../../../detections/components/user_info'); jest.mock('react-redux', () => { const original = jest.requireActual('react-redux'); @@ -79,12 +86,6 @@ jest.mock('../../utils/apollo_context', () => ({ })); describe('Sourcerer Hooks', () => { - // const testId = SourcererScopeName.default; - // const uninitializedId = SourcererScopeName.detections; - beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); - }); const state: State = mockGlobalState; const { storage } = createSecuritySolutionStorageMock(); let store = createStore( @@ -96,6 +97,8 @@ describe('Sourcerer Hooks', () => { ); beforeEach(() => { + jest.clearAllMocks(); + jest.restoreAllMocks(); store = createStore( state, SUB_PLUGINS_REDUCER, @@ -103,169 +106,67 @@ describe('Sourcerer Hooks', () => { kibanaObservable, storage ); + mockUseUserInfo.mockImplementation(() => userInfoState); + }); + it('initializes loading default and timeline index patterns', async () => { + await act(async () => { + const { rerender, waitForNextUpdate } = renderHook(() => useInitSourcerer(), { + wrapper: ({ children }) => {children}, + }); + await waitForNextUpdate(); + rerender(); + expect(mockDispatch).toBeCalledTimes(2); + expect(mockDispatch.mock.calls[0][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', + payload: { id: 'default', loading: true }, + }); + expect(mockDispatch.mock.calls[1][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', + payload: { id: 'timeline', loading: true }, + }); + }); + }); + it('sets signal index name', async () => { + await act(async () => { + mockUseUserInfo.mockImplementation(() => ({ + ...userInfoState, + loading: false, + signalIndexName: 'signals-*', + })); + const { rerender, waitForNextUpdate } = renderHook(() => useInitSourcerer(), { + wrapper: ({ children }) => {children}, + }); + await waitForNextUpdate(); + rerender(); + expect(mockDispatch.mock.calls[2][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SIGNAL_INDEX_NAME', + payload: { signalIndexName: 'signals-*' }, + }); + expect(mockDispatch.mock.calls[3][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_INDEX_PATTERNS', + payload: { id: 'timeline', selectedPatterns: ['signals-*'] }, + }); + }); }); - describe('Initialization', () => { - it('initializes loading default and timeline index patterns', async () => { - await act(async () => { - const { waitForNextUpdate } = renderHook(() => useInitSourcerer(), { + it('handles detections page', async () => { + await act(async () => { + mockUseUserInfo.mockImplementation(() => ({ + ...userInfoState, + signalIndexName: 'signals-*', + isSignalIndexExists: true, + })); + const { rerender, waitForNextUpdate } = renderHook( + () => useInitSourcerer(SourcererScopeName.detections), + { wrapper: ({ children }) => {children}, - }); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(mockDispatch).toBeCalledTimes(2); - expect(mockDispatch.mock.calls[0][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', - payload: { id: 'default', loading: true }, - }); - expect(mockDispatch.mock.calls[1][0]).toEqual({ - type: 'x-pack/security_solution/local/sourcerer/SET_SOURCERER_SCOPE_LOADING', - payload: { id: 'timeline', loading: true }, - }); - // expect(mockDispatch.mock.calls[1][0]).toEqual({ - // type: 'x-pack/security_solution/local/sourcerer/SET_INDEX_PATTERNS_LIST', - // payload: { allIndexPatterns: mockPatterns, kibanaIndexPatterns: [] }, - // }); + } + ); + await waitForNextUpdate(); + rerender(); + expect(mockDispatch.mock.calls[1][0]).toEqual({ + type: 'x-pack/security_solution/local/sourcerer/SET_SELECTED_INDEX_PATTERNS', + payload: { id: 'detections', selectedPatterns: ['signals-*'] }, }); }); - // TO DO sourcerer @S - // it('initializes loading default source group', async () => { - // await act(async () => { - // const { result, waitForNextUpdate } = renderHook( - // () => useInitSourcerer(), - // { - // wrapper: ({ children }) => {children}, - // } - // ); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // expect(result.current).toEqual({ - // activeSourcererScopeId: 'default', - // kibanaIndexPatterns: mockPatterns, - // isIndexPatternsLoading: false, - // getSourcererScopeById: result.current.getSourcererScopeById, - // setActiveSourcererScopeId: result.current.setActiveSourcererScopeId, - // updateSourcererScopeIndices: result.current.updateSourcererScopeIndices, - // }); - // }); - // }); - // it('initialize completes with formatted source group data', async () => { - // await act(async () => { - // const { result, waitForNextUpdate } = renderHook( - // () => useInitSourcerer(), - // { - // wrapper: ({ children }) => {children}, - // } - // ); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // expect(result.current).toEqual({ - // activeSourcererScopeId: testId, - // kibanaIndexPatterns: mockPatterns, - // isIndexPatternsLoading: false, - // getSourcererScopeById: result.current.getSourcererScopeById, - // setActiveSourcererScopeId: result.current.setActiveSourcererScopeId, - // updateSourcererScopeIndices: result.current.updateSourcererScopeIndices, - // }); - // }); - // }); }); - // describe('Methods', () => { - // it('getSourcererScopeById: initialized source group returns defaults', async () => { - // await act(async () => { - // const { result, waitForNextUpdate } = renderHook( - // () => useInitSourcerer(), - // { - // wrapper: ({ children }) => {children}, - // } - // ); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // const initializedSourcererScope = result.current.getSourcererScopeById(testId); - // expect(initializedSourcererScope).toEqual(mockSourcererScope(testId)); - // }); - // }); - // it('getSourcererScopeById: uninitialized source group returns defaults', async () => { - // await act(async () => { - // const { result, waitForNextUpdate } = renderHook( - // () => useInitSourcerer(), - // { - // wrapper: ({ children }) => {children}, - // } - // ); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // const uninitializedSourcererScope = result.current.getSourcererScopeById(uninitializedId); - // expect(uninitializedSourcererScope).toEqual( - // getSourceDefaults(uninitializedId, mockPatterns) - // ); - // }); - // }); - // // it('initializeSourcererScope: initializes source group', async () => { - // // await act(async () => { - // // const { result, waitForNextUpdate } = renderHook( - // // () => useSourcerer(), - // // { - // // wrapper: ({ children }) => {children}, - // // } - // // ); - // // await waitForNextUpdate(); - // // await waitForNextUpdate(); - // // await waitForNextUpdate(); - // // result.current.initializeSourcererScope( - // // uninitializedId, - // // mockSourcererScopes[uninitializedId], - // // true - // // ); - // // await waitForNextUpdate(); - // // const initializedSourcererScope = result.current.getSourcererScopeById(uninitializedId); - // // expect(initializedSourcererScope.selectedPatterns).toEqual( - // // mockSourcererScopes[uninitializedId] - // // ); - // // }); - // // }); - // it('setActiveSourcererScopeId: active source group id gets set only if it gets initialized first', async () => { - // await act(async () => { - // const { result, waitForNextUpdate } = renderHook( - // () => useInitSourcerer(), - // { - // wrapper: ({ children }) => {children}, - // } - // ); - // await waitForNextUpdate(); - // expect(result.current.activeSourcererScopeId).toEqual(testId); - // result.current.setActiveSourcererScopeId(uninitializedId); - // expect(result.current.activeSourcererScopeId).toEqual(testId); - // // result.current.initializeSourcererScope(uninitializedId); - // result.current.setActiveSourcererScopeId(uninitializedId); - // expect(result.current.activeSourcererScopeId).toEqual(uninitializedId); - // }); - // }); - // it('updateSourcererScopeIndices: updates source group indices', async () => { - // await act(async () => { - // const { result, waitForNextUpdate } = renderHook( - // () => useInitSourcerer(), - // { - // wrapper: ({ children }) => {children}, - // } - // ); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // await waitForNextUpdate(); - // let sourceGroup = result.current.getSourcererScopeById(testId); - // expect(sourceGroup.selectedPatterns).toEqual(mockSourcererScopes[testId]); - // expect(sourceGroup.scopePatterns).toEqual(mockSourcererScopes[testId]); - // result.current.updateSourcererScopeIndices({ - // id: testId, - // selectedPatterns: ['endgame-*', 'filebeat-*'], - // }); - // await waitForNextUpdate(); - // sourceGroup = result.current.getSourcererScopeById(testId); - // expect(sourceGroup.scopePatterns).toEqual(mockSourcererScopes[testId]); - // expect(sourceGroup.selectedPatterns).toEqual(['endgame-*', 'filebeat-*']); - // }); - // }); - // }); }); diff --git a/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.test.ts b/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.test.ts new file mode 100644 index 0000000000000..51f05984aa837 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.test.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { createDefaultIndexPatterns, Args } from './helpers'; +import { initialSourcererState, SourcererScopeName } from './model'; + +let defaultArgs: Args = { + eventType: 'all', + id: SourcererScopeName.default, + selectedPatterns: ['auditbeat-*', 'packetbeat-*'], + state: { + ...initialSourcererState, + configIndexPatterns: ['filebeat-*', 'auditbeat-*', 'packetbeat-*'], + kibanaIndexPatterns: [{ id: '123', title: 'journalbeat-*' }], + signalIndexName: 'signals-*', + }, +}; +const eventTypes: Array = ['all', 'raw', 'alert', 'signal', 'custom']; +const ids: Array = [ + SourcererScopeName.default, + SourcererScopeName.detections, + SourcererScopeName.timeline, +]; +describe('createDefaultIndexPatterns', () => { + ids.forEach((id) => { + eventTypes.forEach((et) => { + describe(`id: ${id}, eventType: ${et}`, () => { + beforeEach(() => { + defaultArgs = { + ...defaultArgs, + id, + eventType: et, + }; + }); + it('Selected patterns', () => { + const result = createDefaultIndexPatterns(defaultArgs); + expect(result).toEqual(['auditbeat-*', 'packetbeat-*']); + }); + it('No selected patterns', () => { + const newArgs = { + ...defaultArgs, + selectedPatterns: [], + }; + const result = createDefaultIndexPatterns(newArgs); + if ( + id === SourcererScopeName.detections || + (id === SourcererScopeName.timeline && (et === 'alert' || et === 'signal')) + ) { + expect(result).toEqual(['signals-*']); + } else if (id === SourcererScopeName.timeline && et === 'all') { + expect(result).toEqual(['filebeat-*', 'auditbeat-*', 'packetbeat-*', 'signals-*']); + } else { + expect(result).toEqual(['filebeat-*', 'auditbeat-*', 'packetbeat-*']); + } + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts b/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.ts new file mode 100644 index 0000000000000..3ae9740cfd51d --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/store/sourcerer/helpers.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. + */ +// eslint-disable-next-line no-restricted-imports +import isEmpty from 'lodash/isEmpty'; +import { SourcererModel, SourcererScopeName } from './model'; +import { TimelineEventsType } from '../../../../common/types/timeline'; + +export interface Args { + eventType?: TimelineEventsType; + id: SourcererScopeName; + selectedPatterns: string[]; + state: SourcererModel; +} +export const createDefaultIndexPatterns = ({ eventType, id, selectedPatterns, state }: Args) => { + const kibanaIndexPatterns = state.kibanaIndexPatterns.map((kip) => kip.title); + const newSelectedPatterns = selectedPatterns.filter( + (sp) => + state.configIndexPatterns.includes(sp) || + kibanaIndexPatterns.includes(sp) || + (!isEmpty(state.signalIndexName) && state.signalIndexName === sp) + ); + if (isEmpty(newSelectedPatterns)) { + let defaultIndexPatterns = state.configIndexPatterns; + if (id === SourcererScopeName.timeline && isEmpty(newSelectedPatterns)) { + if (eventType === 'all' && !isEmpty(state.signalIndexName)) { + defaultIndexPatterns = [...state.configIndexPatterns, state.signalIndexName ?? '']; + } else if (eventType === 'raw') { + defaultIndexPatterns = state.configIndexPatterns; + } else if ( + !isEmpty(state.signalIndexName) && + (eventType === 'signal' || eventType === 'alert') + ) { + defaultIndexPatterns = [state.signalIndexName ?? '']; + } + } else if (id === SourcererScopeName.detections && isEmpty(newSelectedPatterns)) { + defaultIndexPatterns = [state.signalIndexName ?? '']; + } + return defaultIndexPatterns; + } + return newSelectedPatterns; +}; diff --git a/x-pack/plugins/security_solution/public/common/store/sourcerer/reducer.ts b/x-pack/plugins/security_solution/public/common/store/sourcerer/reducer.ts index 221244aaf9200..a1112607de24f 100644 --- a/x-pack/plugins/security_solution/public/common/store/sourcerer/reducer.ts +++ b/x-pack/plugins/security_solution/public/common/store/sourcerer/reducer.ts @@ -5,8 +5,7 @@ */ // Prefer importing entire lodash library, e.g. import { get } from "lodash" -// eslint-disable-next-line no-restricted-imports -import isEmpty from 'lodash/isEmpty'; + import { reducerWithInitialState } from 'typescript-fsa-reducers'; import { @@ -16,7 +15,8 @@ import { setSignalIndexName, setSource, } from './actions'; -import { initialSourcererState, SourcererModel, SourcererScopeName } from './model'; +import { initialSourcererState, SourcererModel } from './model'; +import { createDefaultIndexPatterns } from './helpers'; export type SourcererState = SourcererModel; @@ -41,37 +41,13 @@ export const sourcererReducer = reducerWithInitialState(initialSourcererState) }, })) .case(setSelectedIndexPatterns, (state, { id, selectedPatterns, eventType }) => { - const kibanaIndexPatterns = state.kibanaIndexPatterns.map((kip) => kip.title); - const newSelectedPatterns = selectedPatterns.filter( - (sp) => - state.configIndexPatterns.includes(sp) || - kibanaIndexPatterns.includes(sp) || - (!isEmpty(state.signalIndexName) && state.signalIndexName === sp) - ); - let defaultIndexPatterns = state.configIndexPatterns; - if (id === SourcererScopeName.timeline && isEmpty(newSelectedPatterns)) { - if (eventType === 'all' && !isEmpty(state.signalIndexName)) { - defaultIndexPatterns = [...state.configIndexPatterns, state.signalIndexName ?? '']; - } else if (eventType === 'raw') { - defaultIndexPatterns = state.configIndexPatterns; - } else if ( - !isEmpty(state.signalIndexName) && - (eventType === 'signal' || eventType === 'alert') - ) { - defaultIndexPatterns = [state.signalIndexName ?? '']; - } - } else if (id === SourcererScopeName.detections && isEmpty(newSelectedPatterns)) { - defaultIndexPatterns = [state.signalIndexName ?? '']; - } return { ...state, sourcererScopes: { ...state.sourcererScopes, [id]: { ...state.sourcererScopes[id], - selectedPatterns: isEmpty(newSelectedPatterns) - ? defaultIndexPatterns - : newSelectedPatterns, + selectedPatterns: createDefaultIndexPatterns({ eventType, id, selectedPatterns, state }), }, }, }; diff --git a/x-pack/plugins/security_solution/public/detections/components/user_info/index.tsx b/x-pack/plugins/security_solution/public/detections/components/user_info/index.tsx index 00e108ffb89b6..92d1491707260 100644 --- a/x-pack/plugins/security_solution/public/detections/components/user_info/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/user_info/index.tsx @@ -22,7 +22,7 @@ export interface State { signalIndexName: string | null; } -const initialState: State = { +export const initialState: State = { canUserCRUD: null, hasIndexManage: null, hasIndexWrite: null, From c2daceedc2aa8d9d8252f3e7483af7a20ed89263 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 12 Oct 2020 15:49:22 -0400 Subject: [PATCH 14/85] Revert test data changed in previous commit. (#79479) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../es_archives/uptime/pings/data.json.gz | Bin 808 -> 765 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/x-pack/test/functional/es_archives/uptime/pings/data.json.gz b/x-pack/test/functional/es_archives/uptime/pings/data.json.gz index a8f7b84b7d0a86cbdb16cb0638de7d7802dd1695..83441218aad7340284d2fd04ae2ab71e496a9f5c 100644 GIT binary patch literal 765 zcmV6rp}#ed&p;_5A#u(mt3=4chbdui^D7=U(G1g zAe!x{<5gkJQT)qKP|w&XSG4BUyBj%`8{Q1HZAJA;$a+fOYY#zyh<8wK&l}ac9X2YN zYDJ^iX~E`e=}u+2D69%Yc#PU>RBChoH$G(!xz^Y(!B0z)? zoQ|P|rqxvHF!D(}>1sgE3#!?4UW6u{H`0J5lk88&)Ku$1(sv&nXD2JSSLQ3Jbh+GY zHsF=(vU>r!sF&xstwqDN7>>#-I!W~>AO;`ia|lTkCc$X(-4b}itbJJXVqe|kREd3S zx9ljvz=r?_K0pYMEs(=xPpL0CB}s~X5XZ@F1h-Fp3d^2Rb}+h)?wFLPN5fRF=&K7XSyxYdXF+tg~( z#`s6nN+Ng*w;JB6L{2M<$`oOrBumBQn&)h}W0-p|Es05Zk!TM!T;SO2rJgeuj_k1l v=ytLl=h{MSnme)Wc+1mePjM^?68sI0bp!kf%aSPgI@|mOfb?6LO$`75A}V&H literal 808 zcmV+@1K0c?iwFokUUOdn17u-zVJ>QOZ*BnHR?BYcFc97I6;akD*pBmD_5MRw-9&C; z8mmdnwH;_x@$c7mc{q?jAE=8fp$g_b<1=&mKJz?Zy{)L9dw#`B|IP^3r0I?1UH{NO zSy$0lV^C8f)DtCYo(3QQ)>!K$??rjE*OGh1S}GN3SH=win9d=Xhu{IGc?9z)4w4K# z?)%dBoKn>7>X;>Or?&K5T}!_8sw}Z>U0oJUI-_hH$sD@5cF?PXPe+2usHWWi=z-QISzHNzk^Swbix*sioPWXy%IwJ#T5mb4y!z(UKDHw-W zSF_V6Z33Se4&gXL&nsw#2hK04P;ALcy+1|ARbiK@AWLQUSYLbu<{+Mf@ByM60R0I7 z0FUlC$3r|(efsEuH9#~6>4Ob07GtF6nsk+{$;;GUqb$P7<+f-0zuVb%HhceVio`k2 zaufz>nthET_o+{T?HCmYqpuMr72@>l=;|eTwt)pLDO=OZ``A~{kcfu?_UP+M9_;7@8P0{}~JL}Qjh@G(`{0=)qgyUo~#zl4x0s1yM>$EBQ5jo>z@K41xcGk?- z@RBqJl{rKq&K8o2H7n_2$5FT7YMkQuB2^!1xWLlaOFid2l$c``z^~KwI9ppTyA5BD mw>(|;6idS>J0j*cS=v6qPk0(9(KuAc`05|O=9Re74FCYwL4cnC From 5245417897457b6202a4d310c2e58282a3dd03c1 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Mon, 12 Oct 2020 15:54:56 -0400 Subject: [PATCH 15/85] add missing await to fix test (#80202) --- .../ingest_manager_api_integration/apis/fleet/agents/upgrade.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts b/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts index 090279eaa7c30..f90c1d7bcbd6f 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts @@ -180,7 +180,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should not upgrade an unenrolled agent during bulk_upgrade', async () => { const kibanaVersion = await kibanaServer.version.get(); - kibanaServer.savedObjects.update({ + await kibanaServer.savedObjects.update({ id: 'agent1', type: AGENT_SAVED_OBJECT_TYPE, attributes: { unenrolled_at: new Date().toISOString() }, From c00fe2e78cc57aa8854aa611af495d135745fb20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Mon, 12 Oct 2020 22:33:59 +0200 Subject: [PATCH 16/85] =?UTF-8?q?[Security=20Solution]=20Fix=20positioning?= =?UTF-8?q?=20of=20Kibana=20banners=20list=20inside=20Sec=E2=80=A6=20(#801?= =?UTF-8?q?24)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/app/home/index.tsx | 17 ++- .../common/components/header_global/index.tsx | 139 +++++++++--------- 2 files changed, 84 insertions(+), 72 deletions(-) diff --git a/x-pack/plugins/security_solution/public/app/home/index.tsx b/x-pack/plugins/security_solution/public/app/home/index.tsx index 079c34114dfd6..6573457c5f39a 100644 --- a/x-pack/plugins/security_solution/public/app/home/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; import { TimelineId } from '../../../common/types/timeline'; @@ -44,9 +44,18 @@ interface HomePageProps { } const HomePageComponent: React.FC = ({ children }) => { - const { application } = useKibana().services; + const { application, overlays } = useKibana().services; const subPluginId = useRef(''); const { ref, height = 0 } = useThrottledResizeObserver(300); + const banners$ = overlays.banners.get$(); + const [headerFixed, setHeaderFixed] = useState(true); + const mainPaddingTop = headerFixed ? height : 0; + + useEffect(() => { + const subscription = banners$.subscribe((banners) => setHeaderFixed(!banners.length)); + return () => subscription.unsubscribe(); + }, [banners$]); // Only un/re-subscribe if the Observable changes + application.currentAppId$.subscribe((appId) => { subPluginId.current = appId ?? ''; }); @@ -72,9 +81,9 @@ const HomePageComponent: React.FC = ({ children }) => { return ( - + -
+
{indicesExist && showTimeline && ( diff --git a/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx b/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx index 0c6a54d4434d2..11623e1367574 100644 --- a/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/header_global/index.tsx @@ -24,13 +24,13 @@ import { APP_ID, ADD_DATA_PATH, APP_DETECTIONS_PATH } from '../../../../common/c import { useGlobalHeaderPortal } from '../../hooks/use_global_header_portal'; import { LinkAnchor } from '../links'; -const Wrapper = styled.header` - ${({ theme }) => ` +const Wrapper = styled.header<{ $isFixed: boolean }>` + ${({ theme, $isFixed }) => ` background: ${theme.eui.euiColorEmptyShade}; border-bottom: ${theme.eui.euiBorderThin}; width: 100%; z-index: ${theme.eui.euiZNavigation}; - position: fixed; + position: ${$isFixed ? 'fixed' : 'relative'}; `} `; Wrapper.displayName = 'Wrapper'; @@ -62,75 +62,78 @@ FlexGroup.displayName = 'FlexGroup'; interface HeaderGlobalProps { hideDetectionEngine?: boolean; + isFixed?: boolean; } export const HeaderGlobal = React.memo( - forwardRef(({ hideDetectionEngine = false }, ref) => { - const { globalHeaderPortalNode } = useGlobalHeaderPortal(); - const { globalFullScreen } = useFullScreen(); - const search = useGetUrlSearch(navTabs.overview); - const { application, http } = useKibana().services; - const { navigateToApp } = application; - const basePath = http.basePath.get(); - const goToOverview = useCallback( - (ev) => { - ev.preventDefault(); - navigateToApp(`${APP_ID}:${SecurityPageName.overview}`, { path: search }); - }, - [navigateToApp, search] - ); - return ( - - - - - - - - - - - - - key !== SecurityPageName.detections, navTabs) - : navTabs - } - /> - - - - - - {window.location.pathname.includes(APP_DETECTIONS_PATH) && ( + forwardRef( + ({ hideDetectionEngine = false, isFixed = true }, ref) => { + const { globalHeaderPortalNode } = useGlobalHeaderPortal(); + const { globalFullScreen } = useFullScreen(); + const search = useGetUrlSearch(navTabs.overview); + const { application, http } = useKibana().services; + const { navigateToApp } = application; + const basePath = http.basePath.get(); + const goToOverview = useCallback( + (ev) => { + ev.preventDefault(); + navigateToApp(`${APP_ID}:${SecurityPageName.overview}`, { path: search }); + }, + [navigateToApp, search] + ); + return ( + + + + + - + + + + + + + key !== SecurityPageName.detections, navTabs) + : navTabs + } + /> - )} + + + + + {window.location.pathname.includes(APP_DETECTIONS_PATH) && ( + + + + )} - - - {i18n.BUTTON_ADD_DATA} - - - - - - - - - ); - }) + + + {i18n.BUTTON_ADD_DATA} + + + + + + + + + ); + } + ) ); HeaderGlobal.displayName = 'HeaderGlobal'; From 57413f8cb7006dee72ee0d192bbdfc7337cfae66 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Mon, 12 Oct 2020 19:30:39 -0400 Subject: [PATCH 17/85] [Ingest Manager] Fix package upgrade breaking after first rollover before new data has arrived (#79887) * build datastream name from index name * query for data_stream constants to create data stream name * simply datastream tests and add a test to upgrade after a datastream rolls over * improve query * remove dup --- .../ingest_manager/common/types/models/epm.ts | 5 + .../epm/elasticsearch/template/template.ts | 62 +++++++---- .../epm/kibana/index_pattern/install.ts | 18 ++-- .../ingest_manager/server/types/index.tsx | 1 + .../apis/epm/data_stream.ts | 101 +++++++++--------- 5 files changed, 108 insertions(+), 79 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 ea7fd60d1fa3f..2ec9d7be6c882 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -44,6 +44,11 @@ export enum ElasticsearchAssetType { transform = 'transform', } +export enum DataType { + logs = 'logs', + metrics = 'metrics', +} + export enum AgentAssetType { input = 'input', } 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 e0fea59107c26..8d33180d6262d 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 @@ -11,6 +11,7 @@ import { TemplateRef, IndexTemplate, IndexTemplateMappings, + DataType, } from '../../../../types'; import { getRegistryDataStreamAssetBaseName } from '../index'; @@ -400,13 +401,6 @@ const updateExistingIndex = async ({ delete mappings.properties.stream; delete mappings.properties.data_stream; - // get the data_stream values from the index template to compose data stream name - const indexMappings = await getIndexMappings(indexName, callCluster); - const dataStream = indexMappings[indexName].mappings.properties.data_stream.properties; - if (!dataStream.type.value || !dataStream.dataset.value || !dataStream.namespace.value) - throw new Error(`data_stream values are missing from the index template ${indexName}`); - const dataStreamName = `${dataStream.type.value}-${dataStream.dataset.value}-${dataStream.namespace.value}`; - // try to update the mappings first try { await callCluster('indices.putMapping', { @@ -416,13 +410,54 @@ const updateExistingIndex = async ({ // if update fails, rollover data stream } catch (err) { try { + // get the data_stream values to compose datastream name + const searchDataStreamFieldsResponse = await callCluster('search', { + index: indexTemplate.index_patterns[0], + body: { + size: 1, + _source: ['data_stream.namespace', 'data_stream.type', 'data_stream.dataset'], + query: { + bool: { + filter: [ + { + exists: { + field: 'data_stream.type', + }, + }, + { + exists: { + field: 'data_stream.dataset', + }, + }, + { + exists: { + field: 'data_stream.namespace', + }, + }, + ], + }, + }, + }, + }); + if (searchDataStreamFieldsResponse.hits.total.value === 0) + throw new Error('data_stream fields are missing from datastream indices'); + const { + dataset, + namespace, + type, + }: { + dataset: string; + namespace: string; + type: DataType; + } = searchDataStreamFieldsResponse.hits.hits[0]._source.data_stream; + const dataStreamName = `${type}-${dataset}-${namespace}`; const path = `/${dataStreamName}/_rollover`; await callCluster('transport.request', { method: 'POST', path, }); } catch (error) { - throw new Error(`cannot rollover data stream ${dataStreamName}`); + throw new Error(`cannot rollover data stream ${error}`); } } // update settings after mappings was successful to ensure @@ -438,14 +473,3 @@ const updateExistingIndex = async ({ throw new Error(`could not update index template settings for ${indexName}`); } }; - -const getIndexMappings = async (indexName: string, callCluster: CallESAsCurrentUser) => { - try { - const indexMappings = await callCluster('indices.getMapping', { - index: indexName, - }); - return indexMappings; - } catch (err) { - throw new Error(`could not get mapping from ${indexName}`); - } -}; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts index 4804701df23a8..4e307e1ac6880 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts @@ -12,7 +12,12 @@ import { import * as Registry from '../../registry'; import { loadFieldsFromYaml, Fields, Field } from '../../fields/field'; import { getPackageKeysByStatus } from '../../packages/get'; -import { InstallationStatus, RegistryPackage, CallESAsCurrentUser } from '../../../../types'; +import { + InstallationStatus, + RegistryPackage, + CallESAsCurrentUser, + DataType, +} from '../../../../types'; import { appContextService } from '../../../../services'; interface FieldFormatMap { @@ -69,10 +74,7 @@ export interface IndexPatternField { lang?: string; readFromDocValues: boolean; } -export enum IndexPatternType { - logs = 'logs', - metrics = 'metrics', -} + // TODO: use a function overload and make pkgName and pkgVersion required for install/update // and not for an update removal. or separate out the functions export async function installIndexPatterns( @@ -117,7 +119,7 @@ export async function installIndexPatterns( const packageVersionsInfo = await Promise.all(packageVersionsFetchInfoPromise); // for each index pattern type, create an index pattern - const indexPatternTypes = [IndexPatternType.logs, IndexPatternType.metrics]; + const indexPatternTypes = [DataType.logs, DataType.metrics]; indexPatternTypes.forEach(async (indexPatternType) => { // if this is an update because a package is being uninstalled (no pkgkey argument passed) and no other packages are installed, remove the index pattern if (!pkgName && installedPackages.length === 0) { @@ -144,7 +146,7 @@ export async function installIndexPatterns( // of all fields from all data streams matching data stream type export const getAllDataStreamFieldsByType = async ( packages: RegistryPackage[], - dataStreamType: IndexPatternType + dataStreamType: DataType ): Promise => { const dataStreamsPromises = packages.reduce>>((acc, pkg) => { if (pkg.data_streams) { @@ -389,7 +391,7 @@ export const ensureDefaultIndices = async (callCluster: CallESAsCurrentUser) => // that no matching indices exist https://github.com/elastic/kibana/issues/62343 const logger = appContextService.getLogger(); return Promise.all( - Object.keys(IndexPatternType).map(async (indexPattern) => { + Object.keys(DataType).map(async (indexPattern) => { const defaultIndexPatternName = indexPattern + INDEX_PATTERN_PLACEHOLDER_SUFFIX; const indexExists = await callCluster('indices.exists', { index: defaultIndexPatternName }); if (!indexExists) { diff --git a/x-pack/plugins/ingest_manager/server/types/index.tsx b/x-pack/plugins/ingest_manager/server/types/index.tsx index 0c070959e3b93..7d841ed024ce5 100644 --- a/x-pack/plugins/ingest_manager/server/types/index.tsx +++ b/x-pack/plugins/ingest_manager/server/types/index.tsx @@ -73,6 +73,7 @@ export { // Agent Request types PostAgentEnrollRequest, PostAgentCheckinRequest, + DataType, } from '../../common'; export type CallESAsCurrentUser = LegacyScopedClusterClient['callAsCurrentUser']; diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts index 5da9b5e3031b2..b9558240ca007 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/data_stream.ts @@ -24,15 +24,16 @@ export default function (providerContext: FtrProviderContext) { await supertest.delete(`/api/fleet/epm/packages/${pkg}`).set('kbn-xsrf', 'xxxx'); }; const installPackage = async (pkg: string) => { - await supertest + return await supertest .post(`/api/fleet/epm/packages/${pkg}`) .set('kbn-xsrf', 'xxxx') - .send({ force: true }); + .send({ force: true }) + .expect(200); }; describe('datastreams', async () => { skipIfNoDockerRegistry(providerContext); - before(async () => { + beforeEach(async () => { await installPackage(pkgKey); await es.transport.request({ method: 'POST', @@ -61,8 +62,7 @@ export default function (providerContext: FtrProviderContext) { }, }); }); - after(async () => { - await uninstallPackage(pkgUpdateKey); + afterEach(async () => { await es.transport.request({ method: 'DELETE', path: `/_data_stream/${logsTemplateName}-default`, @@ -71,60 +71,57 @@ export default function (providerContext: FtrProviderContext) { method: 'DELETE', path: `/_data_stream/${metricsTemplateName}-default`, }); + await uninstallPackage(pkgKey); + await uninstallPackage(pkgUpdateKey); }); - describe('get datastreams after data sent', async () => { - skipIfNoDockerRegistry(providerContext); - let resLogsDatastream: any; - let resMetricsDatastream: any; - before(async () => { - resLogsDatastream = await es.transport.request({ - method: 'GET', - path: `/_data_stream/${logsTemplateName}-default`, - }); - resMetricsDatastream = await es.transport.request({ - method: 'GET', - path: `/_data_stream/${metricsTemplateName}-default`, - }); - }); - it('should list the logs datastream', async function () { - expect(resLogsDatastream.body.data_streams.length).equal(1); - expect(resLogsDatastream.body.data_streams[0].indices.length).equal(1); - expect(resLogsDatastream.body.data_streams[0].indices[0].index_name).equal( - `.ds-${logsTemplateName}-default-000001` - ); + it('should list the logs and metrics datastream', async function () { + const resLogsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${logsTemplateName}-default`, }); - it('should list the metrics datastream', async function () { - expect(resMetricsDatastream.body.data_streams.length).equal(1); - expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(1); - expect(resMetricsDatastream.body.data_streams[0].indices[0].index_name).equal( - `.ds-${metricsTemplateName}-default-000001` - ); + const resMetricsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${metricsTemplateName}-default`, }); + expect(resLogsDatastream.body.data_streams.length).equal(1); + expect(resLogsDatastream.body.data_streams[0].indices.length).equal(1); + expect(resLogsDatastream.body.data_streams[0].indices[0].index_name).equal( + `.ds-${logsTemplateName}-default-000001` + ); + expect(resMetricsDatastream.body.data_streams.length).equal(1); + expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(1); + expect(resMetricsDatastream.body.data_streams[0].indices[0].index_name).equal( + `.ds-${metricsTemplateName}-default-000001` + ); }); - describe('rollover datastream when mappings are not compatible', async () => { - skipIfNoDockerRegistry(providerContext); - let resLogsDatastream: any; - let resMetricsDatastream: any; - before(async () => { - await installPackage(pkgUpdateKey); - resLogsDatastream = await es.transport.request({ - method: 'GET', - path: `/_data_stream/${logsTemplateName}-default`, - }); - resMetricsDatastream = await es.transport.request({ - method: 'GET', - path: `/_data_stream/${metricsTemplateName}-default`, - }); + + it('after update, it should have rolled over logs datastream because mappings are not compatible and not metrics', async function () { + await installPackage(pkgUpdateKey); + const resLogsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${logsTemplateName}-default`, }); - it('should have rolled over logs datastream', async function () { - expect(resLogsDatastream.body.data_streams[0].indices.length).equal(2); - expect(resLogsDatastream.body.data_streams[0].indices[1].index_name).equal( - `.ds-${logsTemplateName}-default-000002` - ); + const resMetricsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${metricsTemplateName}-default`, + }); + expect(resLogsDatastream.body.data_streams[0].indices.length).equal(2); + expect(resLogsDatastream.body.data_streams[0].indices[1].index_name).equal( + `.ds-${logsTemplateName}-default-000002` + ); + expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(1); + }); + it('should be able to upgrade a package after a rollover', async function () { + await es.transport.request({ + method: 'POST', + path: `/${logsTemplateName}-default/_rollover`, }); - it('should have not rolled over metrics datastream', async function () { - expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(1); + const resLogsDatastream = await es.transport.request({ + method: 'GET', + path: `/_data_stream/${logsTemplateName}-default`, }); + expect(resLogsDatastream.body.data_streams[0].indices.length).equal(2); + await installPackage(pkgUpdateKey); }); }); } From 8da824e1003e2a0b008c7795f4759c476b027754 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Mon, 12 Oct 2020 16:57:16 -0700 Subject: [PATCH 18/85] [CI] Correctly resolve repository root for JUnit reports (#80226) Signed-off-by: Tyler Smalley --- packages/kbn-test/src/jest/junit_reporter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kbn-test/src/jest/junit_reporter.ts b/packages/kbn-test/src/jest/junit_reporter.ts index 8deb6751bc268..0712584122e05 100644 --- a/packages/kbn-test/src/jest/junit_reporter.ts +++ b/packages/kbn-test/src/jest/junit_reporter.ts @@ -22,6 +22,7 @@ import { writeFileSync, mkdirSync } from 'fs'; import xmlBuilder from 'xmlbuilder'; +import { REPO_ROOT } from '@kbn/utils'; import type { Config } from '@jest/types'; import { AggregatedResult, Test, BaseReporter } from '@jest/reporters'; @@ -46,7 +47,7 @@ export default class JestJUnitReporter extends BaseReporter { constructor(globalConfig: Config.GlobalConfig, { rootDirectory, reportName }: ReporterOptions) { super(); this._reportName = reportName || 'Jest Tests'; - this._rootDirectory = rootDirectory ? resolve(rootDirectory) : resolve(__dirname, '../..'); + this._rootDirectory = rootDirectory ? resolve(rootDirectory) : REPO_ROOT; } /** From e858cbc4c8bbc22ab361626b38d6bf1968ba5f06 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 12 Oct 2020 21:01:46 -0400 Subject: [PATCH 19/85] [ML] Datagrid: Ensure column content with 'boolean' schema is not capitalized (#80041) * overwrite css capitalization of boolean schema columns * update css --- .../public/application/components/data_grid/data_grid.scss | 6 ++++++ .../public/application/components/data_grid/data_grid.tsx | 1 + 2 files changed, 7 insertions(+) create mode 100644 x-pack/plugins/ml/public/application/components/data_grid/data_grid.scss diff --git a/x-pack/plugins/ml/public/application/components/data_grid/data_grid.scss b/x-pack/plugins/ml/public/application/components/data_grid/data_grid.scss new file mode 100644 index 0000000000000..2e2f4e7af0a25 --- /dev/null +++ b/x-pack/plugins/ml/public/application/components/data_grid/data_grid.scss @@ -0,0 +1,6 @@ +.mlDataGrid { + .euiDataGridRowCell--boolean { + text-transform: none; + } +} + diff --git a/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx b/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx index f613c5fdb3450..fad2439f5d5ee 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx +++ b/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx @@ -34,6 +34,7 @@ import { TopClasses } from '../../../../common/types/feature_importance'; import { DEFAULT_RESULTS_FIELD } from '../../../../common/constants/data_frame_analytics'; import { DataFrameAnalysisConfigType } from '../../../../common/types/data_frame_analytics'; +import './data_grid.scss'; // TODO Fix row hovering + bar highlighting // import { hoveredRow$ } from './column_chart'; From 0dba45d247ab24b749c342718e98190d25a96577 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Mon, 12 Oct 2020 20:21:04 -0500 Subject: [PATCH 20/85] move field_mapping util to saved_objects plugin (#79918) * move field_mapping util to saved_objects plugin --- ...gin-plugins-data-public.expandshorthand.md | 12 -------- ...ta-public.fieldmappingspec._deserialize.md | 11 -------- ...data-public.fieldmappingspec._serialize.md | 11 -------- ...in-plugins-data-public.fieldmappingspec.md | 21 -------------- ...ugins-data-public.fieldmappingspec.type.md | 11 -------- ...lugin-plugins-data-public.mappingobject.md | 12 -------- .../kibana-plugin-plugins-data-public.md | 3 -- src/plugins/data/common/index.ts | 1 - .../index_patterns/index_pattern.test.ts | 28 ------------------- src/plugins/data/public/index.ts | 2 -- src/plugins/data/public/public.api.md | 18 ------------ .../saved_object/helpers/apply_es_resp.ts | 2 +- .../helpers}/field_mapping/index.ts | 0 .../field_mapping/mapping_setup.test.ts | 2 +- .../helpers}/field_mapping/mapping_setup.ts | 2 +- .../helpers}/field_mapping/types.ts | 2 +- .../helpers/serialize_saved_object.ts | 3 +- 17 files changed, 6 insertions(+), 135 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.expandshorthand.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._deserialize.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._serialize.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.type.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.mappingobject.md rename src/plugins/{data/common => saved_objects/public/saved_object/helpers}/field_mapping/index.ts (100%) rename src/plugins/{data/common => saved_objects/public/saved_object/helpers}/field_mapping/mapping_setup.test.ts (96%) rename src/plugins/{data/common => saved_objects/public/saved_object/helpers}/field_mapping/mapping_setup.ts (96%) rename src/plugins/{data/common => saved_objects/public/saved_object/helpers}/field_mapping/types.ts (94%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.expandshorthand.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.expandshorthand.md deleted file mode 100644 index 6c8594b7eeffd..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.expandshorthand.md +++ /dev/null @@ -1,12 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [expandShorthand](./kibana-plugin-plugins-data-public.expandshorthand.md) - -## expandShorthand variable - - -Signature: - -```typescript -expandShorthand: (sh: Record) => MappingObject -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._deserialize.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._deserialize.md deleted file mode 100644 index 3e8b0abec529c..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._deserialize.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldMappingSpec](./kibana-plugin-plugins-data-public.fieldmappingspec.md) > [\_deserialize](./kibana-plugin-plugins-data-public.fieldmappingspec._deserialize.md) - -## FieldMappingSpec.\_deserialize property - -Signature: - -```typescript -_deserialize?: (mapping: string) => any | undefined; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._serialize.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._serialize.md deleted file mode 100644 index d0aaf7ddd0c17..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec._serialize.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldMappingSpec](./kibana-plugin-plugins-data-public.fieldmappingspec.md) > [\_serialize](./kibana-plugin-plugins-data-public.fieldmappingspec._serialize.md) - -## FieldMappingSpec.\_serialize property - -Signature: - -```typescript -_serialize?: (mapping: any) => string | undefined; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.md deleted file mode 100644 index 38ebe60df99a1..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.md +++ /dev/null @@ -1,21 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldMappingSpec](./kibana-plugin-plugins-data-public.fieldmappingspec.md) - -## FieldMappingSpec interface - - -Signature: - -```typescript -export interface FieldMappingSpec -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [\_deserialize](./kibana-plugin-plugins-data-public.fieldmappingspec._deserialize.md) | (mapping: string) => any | undefined | | -| [\_serialize](./kibana-plugin-plugins-data-public.fieldmappingspec._serialize.md) | (mapping: any) => string | undefined | | -| [type](./kibana-plugin-plugins-data-public.fieldmappingspec.type.md) | ES_FIELD_TYPES | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.type.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.type.md deleted file mode 100644 index 73cff623dc7f2..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldmappingspec.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [FieldMappingSpec](./kibana-plugin-plugins-data-public.fieldmappingspec.md) > [type](./kibana-plugin-plugins-data-public.fieldmappingspec.type.md) - -## FieldMappingSpec.type property - -Signature: - -```typescript -type: ES_FIELD_TYPES; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.mappingobject.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.mappingobject.md deleted file mode 100644 index b1f33c8e8546d..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.mappingobject.md +++ /dev/null @@ -1,12 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [MappingObject](./kibana-plugin-plugins-data-public.mappingobject.md) - -## MappingObject type - - -Signature: - -```typescript -export declare type MappingObject = Record; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index f8897a059377d..6a3c437305cc8 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -59,7 +59,6 @@ | [DataPublicPluginStartUi](./kibana-plugin-plugins-data-public.datapublicpluginstartui.md) | Data plugin prewired UI components | | [EsQueryConfig](./kibana-plugin-plugins-data-public.esqueryconfig.md) | | | [FieldFormatConfig](./kibana-plugin-plugins-data-public.fieldformatconfig.md) | | -| [FieldMappingSpec](./kibana-plugin-plugins-data-public.fieldmappingspec.md) | | | [IDataPluginServices](./kibana-plugin-plugins-data-public.idatapluginservices.md) | | | [IEsSearchRequest](./kibana-plugin-plugins-data-public.iessearchrequest.md) | | | [IFieldSubType](./kibana-plugin-plugins-data-public.ifieldsubtype.md) | | @@ -108,7 +107,6 @@ | [esFilters](./kibana-plugin-plugins-data-public.esfilters.md) | | | [esKuery](./kibana-plugin-plugins-data-public.eskuery.md) | | | [esQuery](./kibana-plugin-plugins-data-public.esquery.md) | | -| [expandShorthand](./kibana-plugin-plugins-data-public.expandshorthand.md) | | | [extractSearchSourceReferences](./kibana-plugin-plugins-data-public.extractsearchsourcereferences.md) | | | [fieldFormats](./kibana-plugin-plugins-data-public.fieldformats.md) | | | [fieldList](./kibana-plugin-plugins-data-public.fieldlist.md) | | @@ -163,7 +161,6 @@ | [ISearch](./kibana-plugin-plugins-data-public.isearch.md) | | | [ISearchGeneric](./kibana-plugin-plugins-data-public.isearchgeneric.md) | | | [ISearchSource](./kibana-plugin-plugins-data-public.isearchsource.md) | search source interface | -| [MappingObject](./kibana-plugin-plugins-data-public.mappingobject.md) | | | [MatchAllFilter](./kibana-plugin-plugins-data-public.matchallfilter.md) | | | [ParsedInterval](./kibana-plugin-plugins-data-public.parsedinterval.md) | | | [PhraseFilter](./kibana-plugin-plugins-data-public.phrasefilter.md) | | diff --git a/src/plugins/data/common/index.ts b/src/plugins/data/common/index.ts index 153b6a633b66d..2d6637daf4324 100644 --- a/src/plugins/data/common/index.ts +++ b/src/plugins/data/common/index.ts @@ -20,7 +20,6 @@ export * from './constants'; export * from './es_query'; export * from './field_formats'; -export * from './field_mapping'; export * from './index_patterns'; export * from './kbn_field_types'; export * from './query'; diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts index a8d53223c06d1..6e11bc8f1d508 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_pattern.test.ts @@ -34,34 +34,6 @@ class MockFieldFormatter {} fieldFormatsMock.getInstance = jest.fn().mockImplementation(() => new MockFieldFormatter()) as any; -jest.mock('../../field_mapping', () => { - const originalModule = jest.requireActual('../../field_mapping'); - - return { - ...originalModule, - expandShorthand: jest.fn(() => ({ - id: true, - title: true, - fieldFormatMap: { - _serialize: jest.fn().mockImplementation(() => {}), - _deserialize: jest.fn().mockImplementation(() => []), - }, - fields: { - _serialize: jest.fn().mockImplementation(() => {}), - _deserialize: jest.fn().mockImplementation((fields) => fields), - }, - sourceFilters: { - _serialize: jest.fn().mockImplementation(() => {}), - _deserialize: jest.fn().mockImplementation(() => undefined), - }, - typeMeta: { - _serialize: jest.fn().mockImplementation(() => {}), - _deserialize: jest.fn().mockImplementation(() => undefined), - }, - })), - }; -}); - // helper function to create index patterns function create(id: string) { const { diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index 9d417684b1651..c041511745be2 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -463,8 +463,6 @@ export { isTimeRange, isQuery, isFilter, isFilters } from '../common'; export { ACTION_GLOBAL_APPLY_FILTER, ApplyGlobalFilterActionContext } from './actions'; -export * from '../common/field_mapping'; - /* * Plugin setup */ diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 0477fb68b3c1e..050f1d917f2c2 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -651,11 +651,6 @@ export type ExistsFilter = Filter & { exists?: FilterExistsProperty; }; -// Warning: (ae-forgotten-export) The symbol "ShorthandFieldMapObject" needs to be exported by the entry point index.d.ts -// -// @public (undocumented) -export const expandShorthand: (sh: Record) => MappingObject; - // Warning: (ae-missing-release-tag) "extractReferences" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -782,16 +777,6 @@ export type FieldFormatsStart = Omit // @public (undocumented) export const fieldList: (specs?: FieldSpec[], shortDotsEnable?: boolean) => IIndexPatternFieldList; -// @public (undocumented) -export interface FieldMappingSpec { - // (undocumented) - _deserialize?: (mapping: string) => any | undefined; - // (undocumented) - _serialize?: (mapping: any) => string | undefined; - // (undocumented) - type: ES_FIELD_TYPES; -} - // Warning: (ae-missing-release-tag) "Filter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1518,9 +1503,6 @@ export interface KueryNode { type: keyof NodeTypes; } -// @public (undocumented) -export type MappingObject = Record; - // Warning: (ae-missing-release-tag) "MatchAllFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts b/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts index 47390c7dc9104..04fa3647de4c7 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts @@ -23,8 +23,8 @@ import { IndexPattern, injectSearchSourceReferences, parseSearchSourceJSON, - expandShorthand, } from '../../../../data/public'; +import { expandShorthand } from './field_mapping'; /** * A given response of and ElasticSearch containing a plain saved object is applied to the given diff --git a/src/plugins/data/common/field_mapping/index.ts b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/index.ts similarity index 100% rename from src/plugins/data/common/field_mapping/index.ts rename to src/plugins/saved_objects/public/saved_object/helpers/field_mapping/index.ts diff --git a/src/plugins/data/common/field_mapping/mapping_setup.test.ts b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/mapping_setup.test.ts similarity index 96% rename from src/plugins/data/common/field_mapping/mapping_setup.test.ts rename to src/plugins/saved_objects/public/saved_object/helpers/field_mapping/mapping_setup.test.ts index e57699e879a87..9353ff6796b5f 100644 --- a/src/plugins/data/common/field_mapping/mapping_setup.test.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/mapping_setup.test.ts @@ -18,7 +18,7 @@ */ import { expandShorthand } from './mapping_setup'; -import { ES_FIELD_TYPES } from '../../../data/common'; +import { ES_FIELD_TYPES } from '../../../../../data/public'; describe('mapping_setup', () => { it('allows shortcuts for field types by just setting the value to the type name', () => { diff --git a/src/plugins/data/common/field_mapping/mapping_setup.ts b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/mapping_setup.ts similarity index 96% rename from src/plugins/data/common/field_mapping/mapping_setup.ts rename to src/plugins/saved_objects/public/saved_object/helpers/field_mapping/mapping_setup.ts index 0bad47d9889f0..804f03d345a96 100644 --- a/src/plugins/data/common/field_mapping/mapping_setup.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/mapping_setup.ts @@ -21,7 +21,7 @@ import { mapValues, isString } from 'lodash'; import { FieldMappingSpec, MappingObject } from './types'; // import from ./common/types to prevent circular dependency of kibana_utils <-> data plugin -import { ES_FIELD_TYPES } from '../../../data/common/types'; +import { ES_FIELD_TYPES } from '../../../../../data/public'; /** @private */ type ShorthandFieldMapObject = FieldMappingSpec | ES_FIELD_TYPES | 'json'; diff --git a/src/plugins/data/common/field_mapping/types.ts b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/types.ts similarity index 94% rename from src/plugins/data/common/field_mapping/types.ts rename to src/plugins/saved_objects/public/saved_object/helpers/field_mapping/types.ts index 973a58d3baec4..a60a6b10623fc 100644 --- a/src/plugins/data/common/field_mapping/types.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/field_mapping/types.ts @@ -17,7 +17,7 @@ * under the License. */ -import { ES_FIELD_TYPES } from '../../../data/common'; +import { ES_FIELD_TYPES } from '../../../../../data/public'; /** @public */ export interface FieldMappingSpec { diff --git a/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts b/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts index 24e467ad18ac4..a0ab527ce1743 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts @@ -18,7 +18,8 @@ */ import _ from 'lodash'; import { SavedObject, SavedObjectConfig } from '../../types'; -import { extractSearchSourceReferences, expandShorthand } from '../../../../data/public'; +import { extractSearchSourceReferences } from '../../../../data/public'; +import { expandShorthand } from './field_mapping'; export function serializeSavedObject(savedObject: SavedObject, config: SavedObjectConfig) { // mapping definition for the fields that this object will expose From 619ba21152eab9be6a93687649f0e715576a00bf Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 13 Oct 2020 10:09:25 +0300 Subject: [PATCH 21/85] [Security Solution][Timeline] Fix SelectableTimeline search (#80128) --- .../cases/components/add_comment/index.tsx | 13 +-- .../public/cases/components/create/index.tsx | 15 +-- .../insert_timeline_popover/index.test.tsx | 22 ----- .../insert_timeline_popover/index.tsx | 95 ------------------- .../timeline/selectable_timeline/index.tsx | 15 ++- 5 files changed, 13 insertions(+), 147 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index 14c42697dcbb4..3e3d21b9926d1 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -12,7 +12,6 @@ import { CommentRequest } from '../../../../../case/common/api'; import { usePostComment } from '../../containers/use_post_comment'; import { Case } from '../../containers/types'; import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; -import { InsertTimelinePopover } from '../../../timelines/components/timeline/insert_timeline_popover'; import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; import { Form, useForm, UseField, useFormData } from '../../../shared_imports'; @@ -61,10 +60,7 @@ export const AddComment = React.memo( setFieldValue, ]); - const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( - comment, - onCommentChange - ); + const { handleCursorChange } = useInsertTimeline(comment, onCommentChange); const addQuote = useCallback( (quote) => { @@ -116,13 +112,6 @@ export const AddComment = React.memo( {i18n.ADD_COMMENT} ), - topRightContent: ( - - ), }} /> diff --git a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx index b7a80bcf6633c..42633c5d2ccf8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/create/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/create/index.tsx @@ -28,7 +28,6 @@ import { } from '../../../shared_imports'; import { usePostCase } from '../../containers/use_post_case'; import { schema, FormProps } from './schema'; -import { InsertTimelinePopover } from '../../../timelines/components/timeline/insert_timeline_popover'; import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; import { MarkdownEditorForm } from '../../../common/components/markdown_editor/eui_form'; import { useGetTags } from '../../containers/use_get_tags'; @@ -136,10 +135,7 @@ export const Create = React.memo(() => { setFieldValue, ]); - const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( - description, - onDescriptionChange - ); + const { handleCursorChange } = useInsertTimeline(description, onDescriptionChange); const handleTimelineClick = useTimelineClick(); @@ -221,20 +217,13 @@ export const Create = React.memo(() => { isDisabled: isLoading, onClickTimeline: handleTimelineClick, onCursorPositionUpdate: handleCursorChange, - topRightContent: ( - - ), }} /> ), }), - [isLoading, options, handleCursorChange, handleTimelineClick, handleOnTimelineChange] + [isLoading, options, handleCursorChange, handleTimelineClick] ); const secondStep = useMemo( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx deleted file mode 100644 index bfd76f0a98d46..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx +++ /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 React from 'react'; -import { mount } from 'enzyme'; -import { InsertTimelinePopoverComponent } from '.'; - -const onTimelineChange = jest.fn(); -const props = { - isDisabled: false, - onTimelineChange, -}; - -describe('Insert timeline popover ', () => { - it('it renders', () => { - const wrapper = mount(); - expect(wrapper.find('[data-test-subj="insert-timeline-popover"]').exists()).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx deleted file mode 100644 index 11ad54321da88..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx +++ /dev/null @@ -1,95 +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 { EuiButtonIcon, EuiPopover, EuiSelectableOption, EuiToolTip } from '@elastic/eui'; -import React, { memo, useCallback, useMemo, useState } from 'react'; - -import { OpenTimelineResult } from '../../open_timeline/types'; -import { SelectableTimeline } from '../selectable_timeline'; -import * as i18n from '../translations'; -import { TimelineType } from '../../../../../common/types/timeline'; - -interface InsertTimelinePopoverProps { - isDisabled: boolean; - hideUntitled?: boolean; - onTimelineChange: ( - timelineTitle: string, - timelineId: string | null, - graphEventId?: string - ) => void; -} - -type Props = InsertTimelinePopoverProps; - -export const InsertTimelinePopoverComponent: React.FC = ({ - isDisabled, - hideUntitled = false, - onTimelineChange, -}) => { - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - - const handleClosePopover = useCallback(() => { - setIsPopoverOpen(false); - }, []); - - const handleOpenPopover = useCallback(() => { - setIsPopoverOpen(true); - }, []); - - const insertTimelineButton = useMemo( - () => ( - {i18n.INSERT_TIMELINE}

}> - -
- ), - [handleOpenPopover, isDisabled] - ); - - const handleGetSelectableOptions = useCallback( - ({ timelines }) => [ - ...timelines.map( - (t: OpenTimelineResult, index: number) => - ({ - description: t.description, - favorite: t.favorite, - label: t.title, - id: t.savedObjectId, - key: `${t.title}-${index}`, - title: t.title, - checked: undefined, - } as EuiSelectableOption) - ), - ], - [] - ); - - return ( - - - - ); -}; - -export const InsertTimelinePopover = memo(InsertTimelinePopoverComponent); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx index 641a4105e1af1..a80576c7237f4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/selectable_timeline/index.tsx @@ -16,7 +16,7 @@ import { EuiFilterGroup, EuiFilterButton, } from '@elastic/eui'; -import { isEmpty } from 'lodash/fp'; +import { isEmpty, debounce } from 'lodash/fp'; import React, { memo, useCallback, useMemo, useState, useEffect, useRef } from 'react'; import styled from 'styled-components'; @@ -120,9 +120,14 @@ const SelectableTimelineComponent: React.FC = ({ const selectableListOuterRef = useRef(null); const selectableListInnerRef = useRef(null); - const onSearchTimeline = useCallback((val) => { - setSearchTimelineValue(val); - }, []); + const debouncedSetSearchTimelineValue = useMemo(() => debounce(500, setSearchTimelineValue), []); + + const onSearchTimeline = useCallback( + (val) => { + debouncedSetSearchTimelineValue(val); + }, + [debouncedSetSearchTimelineValue] + ); const handleOnToggleOnlyFavorites = useCallback(() => { setOnlyFavorites(!onlyFavorites); @@ -238,7 +243,7 @@ const SelectableTimelineComponent: React.FC = ({ isLoading: loading, placeholder: useMemo(() => i18n.SEARCH_BOX_TIMELINE_PLACEHOLDER(timelineType), [timelineType]), onSearch: onSearchTimeline, - incremental: false, + incremental: true, inputRef: (node: HTMLInputElement | null) => { setSearchRef(node); }, From ce9ccc582e3cc54a40d751fc5b060c0c603c4264 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 13 Oct 2020 10:36:11 +0300 Subject: [PATCH 22/85] Line Visualization improper scaling can result in gaps #79663 (#80135) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../lib/time_buckets/time_buckets.test.ts | 18 ++++++++++++++++++ .../buckets/lib/time_buckets/time_buckets.ts | 8 +++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts index 04e64233ce196..8128f1a18a66a 100644 --- a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.test.ts @@ -69,6 +69,7 @@ describe('TimeBuckets', () => { test('setInterval/getInterval - intreval is a string', () => { const timeBuckets = new TimeBuckets(timeBucketConfig); timeBuckets.setInterval('20m'); + const interval = timeBuckets.getInterval(); expect(interval.description).toEqual('20 minutes'); @@ -77,6 +78,23 @@ describe('TimeBuckets', () => { expect(interval.expression).toEqual('20m'); }); + test('getInterval - should scale interval', () => { + const timeBuckets = new TimeBuckets(timeBucketConfig); + const bounds = { + min: moment('2020-03-25'), + max: moment('2020-03-31'), + }; + timeBuckets.setBounds(bounds); + timeBuckets.setInterval('1m'); + + const interval = timeBuckets.getInterval(); + + expect(interval.description).toEqual('day'); + expect(interval.esValue).toEqual(1); + expect(interval.esUnit).toEqual('d'); + expect(interval.expression).toEqual('1d'); + }); + test('setInterval/getInterval - intreval is a string and bounds is defined', () => { const timeBuckets = new TimeBuckets(timeBucketConfig); const bounds = { diff --git a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts index d054df0c9274e..f11f89317aea6 100644 --- a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts +++ b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/time_buckets.ts @@ -263,18 +263,16 @@ export class TimeBuckets { } const maxLength: number = this._timeBucketConfig['histogram:maxBars']; - const approxLen = Number(duration) / Number(interval); + const minInterval = calcAutoIntervalLessThan(maxLength, Number(duration)); let scaled; - if (approxLen > maxLength) { - scaled = calcAutoIntervalLessThan(maxLength, Number(duration)); + if (interval < minInterval) { + scaled = minInterval; } else { return interval; } - if (+scaled === +interval) return interval; - interval = decorateInterval(interval); return Object.assign(scaled, { preScaled: interval, From 162cf2eef945afdc84690ba70f0d5166b372bcab Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Tue, 13 Oct 2020 10:59:06 +0200 Subject: [PATCH 23/85] Improve vis editor typings (#80004) * Improve vis editor typings * Move VisEditorContructor to visualize * Fix tests * Fix typings Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/default_editor_controller.tsx | 4 ++-- src/plugins/visualizations/public/index.ts | 2 +- .../visualizations/public/vis_types/index.ts | 2 +- .../visualizations/public/vis_types/types.ts | 9 ++++--- .../visualize/public/application/types.ts | 10 +++++++- .../utils/use/use_saved_vis_instance.test.ts | 7 +++++- .../utils/use/use_saved_vis_instance.ts | 24 ++++++++++--------- .../application/utils/use/use_vis_byvalue.ts | 2 +- src/plugins/visualize/public/index.ts | 6 ++++- 9 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/plugins/vis_default_editor/public/default_editor_controller.tsx b/src/plugins/vis_default_editor/public/default_editor_controller.tsx index 0efd6e7746fd2..707b14c23ea75 100644 --- a/src/plugins/vis_default_editor/public/default_editor_controller.tsx +++ b/src/plugins/vis_default_editor/public/default_editor_controller.tsx @@ -22,12 +22,12 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { EventEmitter } from 'events'; import { EuiErrorBoundary, EuiLoadingChart } from '@elastic/eui'; -import { EditorRenderProps } from 'src/plugins/visualize/public'; +import { EditorRenderProps, IEditorController } from 'src/plugins/visualize/public'; import { Vis, VisualizeEmbeddableContract } from 'src/plugins/visualizations/public'; const DefaultEditor = lazy(() => import('./default_editor')); -class DefaultEditorController { +class DefaultEditorController implements IEditorController { constructor( private el: HTMLElement, private vis: Vis, diff --git a/src/plugins/visualizations/public/index.ts b/src/plugins/visualizations/public/index.ts index 99c13b42b8b28..081399fd1fbea 100644 --- a/src/plugins/visualizations/public/index.ts +++ b/src/plugins/visualizations/public/index.ts @@ -36,7 +36,7 @@ export { getSchemas as getVisSchemas } from './legacy/build_pipeline'; /** @public types */ export { VisualizationsSetup, VisualizationsStart }; -export { VisTypeAlias, VisType, BaseVisTypeOptions, ReactVisTypeOptions } from './vis_types'; +export type { VisTypeAlias, VisType, BaseVisTypeOptions, ReactVisTypeOptions } from './vis_types'; export { VisParams, SerializedVis, SerializedVisData, VisData } from './vis'; export type VisualizeEmbeddableFactoryContract = PublicContract; export type VisualizeEmbeddableContract = PublicContract; diff --git a/src/plugins/visualizations/public/vis_types/index.ts b/src/plugins/visualizations/public/vis_types/index.ts index 22561decabea4..a46b257c9905c 100644 --- a/src/plugins/visualizations/public/vis_types/index.ts +++ b/src/plugins/visualizations/public/vis_types/index.ts @@ -18,6 +18,6 @@ */ export * from './types_service'; -export { VisType } from './types'; +export type { VisType } from './types'; export type { BaseVisTypeOptions } from './base_vis_type'; export type { ReactVisTypeOptions } from './react_vis_type'; diff --git a/src/plugins/visualizations/public/vis_types/types.ts b/src/plugins/visualizations/public/vis_types/types.ts index 0cf345bf07be6..7206e9612f102 100644 --- a/src/plugins/visualizations/public/vis_types/types.ts +++ b/src/plugins/visualizations/public/vis_types/types.ts @@ -20,6 +20,7 @@ import { IconType } from '@elastic/eui'; import React from 'react'; import { Adapters } from 'src/plugins/inspector'; +import { VisEditorConstructor } from 'src/plugins/visualize/public'; import { ISchemas } from 'src/plugins/vis_default_editor/public'; import { TriggerContextMapping } from '../../../ui_actions/public'; import { Vis, VisToExpressionAst, VisualizationControllerConstructor } from '../types'; @@ -69,12 +70,14 @@ export interface VisType { readonly options: VisTypeOptions; - // TODO: The following types still need to be refined properly. - /** * The editor that should be used to edit visualizations of this type. + * If this is not specified the default visualize editor will be used (and should be configured via schemas) + * and editorConfig. */ - readonly editor?: any; + readonly editor?: VisEditorConstructor; + + // TODO: The following types still need to be refined properly. readonly editorConfig: Record; readonly visConfig: Record; } diff --git a/src/plugins/visualize/public/application/types.ts b/src/plugins/visualize/public/application/types.ts index 00fa6e74f952a..6cc8f5c26584a 100644 --- a/src/plugins/visualize/public/application/types.ts +++ b/src/plugins/visualize/public/application/types.ts @@ -45,6 +45,7 @@ import { SharePluginStart } from 'src/plugins/share/public'; import { SavedObjectsStart, SavedObject } from 'src/plugins/saved_objects/public'; import { EmbeddableStart } from 'src/plugins/embeddable/public'; import { UrlForwardingStart } from 'src/plugins/url_forwarding/public'; +import { EventEmitter } from 'events'; import { DashboardStart } from '../../../dashboard/public'; export type PureVisState = SavedVisState; @@ -131,7 +132,14 @@ export interface ByValueVisInstance { export type VisualizeEditorVisInstance = SavedVisInstance | ByValueVisInstance; +export type VisEditorConstructor = new ( + element: HTMLElement, + vis: Vis, + eventEmitter: EventEmitter, + embeddableHandler: VisualizeEmbeddableContract +) => IEditorController; + export interface IEditorController { - render(props: EditorRenderProps): void; + render(props: EditorRenderProps): Promise | void; destroy(): void; } diff --git a/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts b/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts index ce0f5fe965d7d..3f9676a9c9385 100644 --- a/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts @@ -116,6 +116,7 @@ describe('useSavedVisInstance', () => { useSavedVisInstance(mockServices, eventEmitter, true, savedVisId) ); + result.current.visEditorRef.current = document.createElement('div'); expect(mockGetVisualizationInstance).toHaveBeenCalledWith(mockServices, savedVisId); expect(mockGetVisualizationInstance.mock.calls.length).toBe(1); @@ -129,10 +130,12 @@ describe('useSavedVisInstance', () => { }); test('should destroy the editor and the savedVis on unmount if chrome exists', async () => { - const { unmount, waitForNextUpdate } = renderHook(() => + const { result, unmount, waitForNextUpdate } = renderHook(() => useSavedVisInstance(mockServices, eventEmitter, true, savedVisId) ); + result.current.visEditorRef.current = document.createElement('div'); + await waitForNextUpdate(); unmount(); @@ -158,6 +161,8 @@ describe('useSavedVisInstance', () => { useSavedVisInstance(mockServices, eventEmitter, true, undefined) ); + result.current.visEditorRef.current = document.createElement('div'); + expect(mockGetVisualizationInstance).toHaveBeenCalledWith(mockServices, { indexPattern: '1a2b3c4d', type: 'area', diff --git a/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.ts b/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.ts index ec815b8cfcbee..44fbcce82f458 100644 --- a/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.ts +++ b/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.ts @@ -44,7 +44,7 @@ export const useSavedVisInstance = ( savedVisInstance?: SavedVisInstance; visEditorController?: IEditorController; }>({}); - const visEditorRef = useRef(null); + const visEditorRef = useRef(null); const visId = useRef(''); useEffect(() => { @@ -102,16 +102,18 @@ export const useSavedVisInstance = ( let visEditorController; // do not create editor in embeded mode - if (isChromeVisible) { - const Editor = vis.type.editor || DefaultEditorController; - visEditorController = new Editor( - visEditorRef.current, - vis, - eventEmitter, - embeddableHandler - ); - } else if (visEditorRef.current) { - embeddableHandler.render(visEditorRef.current); + if (visEditorRef.current) { + if (isChromeVisible) { + const Editor = vis.type.editor || DefaultEditorController; + visEditorController = new Editor( + visEditorRef.current, + vis, + eventEmitter, + embeddableHandler + ); + } else { + embeddableHandler.render(visEditorRef.current); + } } setState({ diff --git a/src/plugins/visualize/public/application/utils/use/use_vis_byvalue.ts b/src/plugins/visualize/public/application/utils/use/use_vis_byvalue.ts index f2758d0cc01a4..e0286a63b9feb 100644 --- a/src/plugins/visualize/public/application/utils/use/use_vis_byvalue.ts +++ b/src/plugins/visualize/public/application/utils/use/use_vis_byvalue.ts @@ -41,7 +41,7 @@ export const useVisByValue = ( useEffect(() => { const { chrome } = services; const getVisInstance = async () => { - if (!valueInput || loaded.current) { + if (!valueInput || loaded.current || !visEditorRef.current) { return; } const byValueVisInstance = await getVisualizationInstanceFromInput(services, valueInput); diff --git a/src/plugins/visualize/public/index.ts b/src/plugins/visualize/public/index.ts index d437cadad9fab..246806f300800 100644 --- a/src/plugins/visualize/public/index.ts +++ b/src/plugins/visualize/public/index.ts @@ -20,7 +20,11 @@ import { PluginInitializerContext } from 'kibana/public'; import { VisualizePlugin } from './plugin'; -export { EditorRenderProps } from './application/types'; +export type { + EditorRenderProps, + IEditorController, + VisEditorConstructor, +} from './application/types'; export { VisualizeConstants } from './application/visualize_constants'; export const plugin = (context: PluginInitializerContext) => { From 190fba102ef717954c9353ee058f5ba70dae2679 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Tue, 13 Oct 2020 13:14:39 +0300 Subject: [PATCH 24/85] Add links to deps analysis tools (#79624) * add links * anoter link --- docs/developer/best-practices/typescript.asciidoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/developer/best-practices/typescript.asciidoc b/docs/developer/best-practices/typescript.asciidoc index 3321aae3c0994..a2cda1e0b1e87 100644 --- a/docs/developer/best-practices/typescript.asciidoc +++ b/docs/developer/best-practices/typescript.asciidoc @@ -19,7 +19,7 @@ More details are available in the https://www.typescriptlang.org/docs/handbook/p ==== Caveats This architecture imposes several limitations to which we must comply: -- Projects cannot have circular dependencies. Even though the Kibana platform doesn't support circular dependencies between Kibana plugins, TypeScript (and ES6 modules) does allow circular imports between files. So in theory, you may face a problem when migrating to the TS project references and you will have to resolve this circular dependency. +- Projects cannot have circular dependencies. Even though the Kibana platform doesn't support circular dependencies between Kibana plugins, TypeScript (and ES6 modules) does allow circular imports between files. So in theory, you may face a problem when migrating to the TS project references and you will have to resolve this circular dependency. https://github.com/elastic/kibana/issues/78162 is going to provide a tool to find such problem places. - A project must emit its type declaration. It's not always possible to generate a type declaration if the compiler cannot infer a type. There are two basic cases: 1. Your plugin exports a type inferring an internal type declared in Kibana codebase. In this case, you'll have to either export an internal type or to declare an exported type explicitly. @@ -27,7 +27,8 @@ This architecture imposes several limitations to which we must comply: [discrete] ==== Prerequisites -Since `tsc` doesn't support circular project references, the migration order does matter. You can migrate your plugin only when all the plugin dependencies already have migrated. It creates a situation where commonly used plugins (such as `data` or `kibana_react`) have to migrate first. +Since project refs rely on generated `d.ts` files, the migration order does matter. You can migrate your plugin only when all the plugin dependencies already have migrated. It creates a situation where commonly used plugins (such as `data` or `kibana_react`) have to migrate first. +https://github.com/elastic/kibana/issues/79343 is going to provide a tool for identifying a plugin dependency tree. [discrete] ==== Implementation From 7b00052c5b647255f7a92c543f849fd47e80109a Mon Sep 17 00:00:00 2001 From: ymao1 Date: Tue, 13 Oct 2020 07:36:53 -0400 Subject: [PATCH 25/85] [Alerting] Prompt for confirmation when saving alert with no action (#79892) * Adding save confirmation for new alerts with no associated actions * Adding functional tests * Fixing uptime alert test * Fixing uptime alert test * PR fixes * Updating confirmation modal wording Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../sections/alert_form/alert_add.tsx | 43 +++++++++-- .../alert_form/confirm_alert_save.tsx | 52 +++++++++++++ .../test/functional/services/uptime/alerts.ts | 3 + .../apps/triggers_actions_ui/alerts.ts | 75 ++++++++++++++----- .../apps/uptime/alert_flyout.ts | 2 + .../apps/uptime/anomaly_alert.ts | 1 + 6 files changed, 150 insertions(+), 26 deletions(-) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.tsx diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx index 7b81298e8e4b6..84726bc950ef2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_add.tsx @@ -27,6 +27,8 @@ import { alertReducer } from './alert_reducer'; import { createAlert } from '../../lib/alert_api'; import { HealthCheck } from '../../components/health_check'; import { PLUGIN } from '../../constants/plugin'; +import { ConfirmAlertSave } from './confirm_alert_save'; +import { hasShowActionsCapability } from '../../lib/capabilities'; interface AlertAddProps { consumer: string; @@ -59,6 +61,7 @@ export const AlertAdd = ({ const [{ alert }, dispatch] = useReducer(alertReducer, { alert: initialAlert }); const [isSaving, setIsSaving] = useState(false); + const [isConfirmAlertSaveModalOpen, setIsConfirmAlertSaveModalOpen] = useState(false); const setAlert = (value: any) => { dispatch({ command: { type: 'setAlert' }, payload: { key: 'alert', value } }); @@ -74,8 +77,11 @@ export const AlertAdd = ({ alertTypeRegistry, actionTypeRegistry, docLinks, + capabilities, } = useAlertsContext(); + const canShowActions = hasShowActionsCapability(capabilities); + useEffect(() => { setAlertProperty('alertTypeId', alertTypeId); }, [alertTypeId]); @@ -85,6 +91,17 @@ export const AlertAdd = ({ setAlert(initialAlert); }, [initialAlert, setAddFlyoutVisibility]); + const saveAlertAndCloseFlyout = async () => { + const savedAlert = await onSaveAlert(); + setIsSaving(false); + if (savedAlert) { + closeFlyout(); + if (reloadAlerts) { + reloadAlerts(); + } + } + }; + if (!addFlyoutVisible) { return null; } @@ -109,6 +126,9 @@ export const AlertAdd = ({ !!Object.keys(errorObj.errors).find((errorKey) => errorObj.errors[errorKey].length >= 1) ) !== undefined; + // Confirm before saving if user is able to add actions but hasn't added any to this alert + const shouldConfirmSave = canShowActions && alert.actions?.length === 0; + async function onSaveAlert(): Promise { try { const newAlert = await createAlert({ http, alert }); @@ -195,13 +215,10 @@ export const AlertAdd = ({ isLoading={isSaving} onClick={async () => { setIsSaving(true); - const savedAlert = await onSaveAlert(); - setIsSaving(false); - if (savedAlert) { - closeFlyout(); - if (reloadAlerts) { - reloadAlerts(); - } + if (shouldConfirmSave) { + setIsConfirmAlertSaveModalOpen(true); + } else { + await saveAlertAndCloseFlyout(); } }} > @@ -214,6 +231,18 @@ export const AlertAdd = ({ + {isConfirmAlertSaveModalOpen && ( + { + setIsConfirmAlertSaveModalOpen(false); + await saveAlertAndCloseFlyout(); + }} + onCancel={() => { + setIsSaving(false); + setIsConfirmAlertSaveModalOpen(false); + }} + /> + )} ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.tsx new file mode 100644 index 0000000000000..f23948d1d81bf --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/confirm_alert_save.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 { EuiOverlayMask, EuiConfirmModal } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; + +interface Props { + onConfirm: () => void; + onCancel: () => void; +} + +export const ConfirmAlertSave: React.FC = ({ onConfirm, onCancel }) => { + return ( + + +

+ +

+
+
+ ); +}; diff --git a/x-pack/test/functional/services/uptime/alerts.ts b/x-pack/test/functional/services/uptime/alerts.ts index c4f75b843d781..6ade7dc485a88 100644 --- a/x-pack/test/functional/services/uptime/alerts.ts +++ b/x-pack/test/functional/services/uptime/alerts.ts @@ -114,5 +114,8 @@ export function UptimeAlertsProvider({ getService }: FtrProviderContext) { async clickSaveAlertButton() { return testSubjects.click('saveAlertButton'); }, + async clickSaveAlertsConfirmButton() { + return testSubjects.click('confirmAlertSaveModal > confirmModalConfirmButton'); + }, }; } diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts index 25a7a57e52413..4dd7c9f3b3716 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts @@ -54,6 +54,28 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); } + async function defineAlert(alertName: string) { + await pageObjects.triggersActionsUI.clickCreateAlertButton(); + await testSubjects.setValue('alertNameInput', alertName); + await testSubjects.click('.index-threshold-SelectOption'); + await testSubjects.click('selectIndexExpression'); + const comboBox = await find.byCssSelector('#indexSelectSearchBox'); + await comboBox.click(); + await comboBox.type('k'); + const filterSelectItem = await find.byCssSelector(`.euiFilterSelectItem`); + await filterSelectItem.click(); + await testSubjects.click('thresholdAlertTimeFieldSelect'); + await retry.try(async () => { + const fieldOptions = await find.allByCssSelector('#thresholdTimeField option'); + expect(fieldOptions[1]).not.to.be(undefined); + await fieldOptions[1].click(); + }); + await testSubjects.click('closePopover'); + // need this two out of popup clicks to close them + const nameInput = await testSubjects.find('alertNameInput'); + await nameInput.click(); + } + describe('alerts', function () { before(async () => { await pageObjects.common.navigateToApp('triggersActions'); @@ -62,25 +84,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should create an alert', async () => { const alertName = generateUniqueKey(); - await pageObjects.triggersActionsUI.clickCreateAlertButton(); - await testSubjects.setValue('alertNameInput', alertName); - await testSubjects.click('.index-threshold-SelectOption'); - await testSubjects.click('selectIndexExpression'); - const comboBox = await find.byCssSelector('#indexSelectSearchBox'); - await comboBox.click(); - await comboBox.type('k'); - const filterSelectItem = await find.byCssSelector(`.euiFilterSelectItem`); - await filterSelectItem.click(); - await testSubjects.click('thresholdAlertTimeFieldSelect'); - await retry.try(async () => { - const fieldOptions = await find.allByCssSelector('#thresholdTimeField option'); - expect(fieldOptions[1]).not.to.be(undefined); - await fieldOptions[1].click(); - }); - await testSubjects.click('closePopover'); - // need this two out of popup clicks to close them - const nameInput = await testSubjects.find('alertNameInput'); - await nameInput.click(); + await defineAlert(alertName); await testSubjects.click('.slack-ActionTypeSelectOption'); await testSubjects.click('addNewActionConnectorButton-.slack'); @@ -123,6 +127,39 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await deleteAlerts(alertsToDelete.map((alertItem: { id: string }) => alertItem.id)); }); + it('should show save confirmation before creating alert with no actions', async () => { + const alertName = generateUniqueKey(); + await defineAlert(alertName); + + await testSubjects.click('saveAlertButton'); + await testSubjects.existOrFail('confirmAlertSaveModal'); + await testSubjects.click('confirmAlertSaveModal > confirmModalCancelButton'); + await testSubjects.missingOrFail('confirmAlertSaveModal'); + await find.existsByCssSelector('[data-test-subj="saveAlertButton"]:not(disabled)'); + + await testSubjects.click('saveAlertButton'); + await testSubjects.existOrFail('confirmAlertSaveModal'); + await testSubjects.click('confirmAlertSaveModal > confirmModalConfirmButton'); + await testSubjects.missingOrFail('confirmAlertSaveModal'); + + const toastTitle = await pageObjects.common.closeToast(); + expect(toastTitle).to.eql(`Saved '${alertName}'`); + await pageObjects.triggersActionsUI.searchAlerts(alertName); + const searchResultsAfterSave = await pageObjects.triggersActionsUI.getAlertsList(); + expect(searchResultsAfterSave).to.eql([ + { + name: alertName, + tagsText: '', + alertType: 'Index threshold', + interval: '1m', + }, + ]); + + // clean up created alert + const alertsToDelete = await getAlertsByName(alertName); + await deleteAlerts(alertsToDelete.map((alertItem: { id: string }) => alertItem.id)); + }); + it('should display alerts in alphabetical order', async () => { const uniqueKey = generateUniqueKey(); const a = await createAlert({ name: 'b', tags: [uniqueKey] }); diff --git a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts index a6de87d6f7b1a..ff4ab65a310ed 100644 --- a/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts +++ b/x-pack/test/functional_with_es_ssl/apps/uptime/alert_flyout.ts @@ -79,6 +79,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('can save alert', async () => { await alerts.clickSaveAlertButton(); + await alerts.clickSaveAlertsConfirmButton(); await pageObjects.common.closeToast(); }); @@ -165,6 +166,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('can save alert', async () => { await alerts.clickSaveAlertButton(); + await alerts.clickSaveAlertsConfirmButton(); await pageObjects.common.closeToast(); }); diff --git a/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts b/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts index 55ef7e9784ff4..c9512dd12b78e 100644 --- a/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts +++ b/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts @@ -79,6 +79,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('can save alert', async () => { await alerts.clickSaveAlertButton(); + await alerts.clickSaveAlertsConfirmButton(); await pageObjects.common.closeToast(); }); From a0c649ee97ee1c020e0d341705c4029e2d4f6bfe Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 13 Oct 2020 13:41:28 +0200 Subject: [PATCH 26/85] [ILM] Cloud-specific changes for 7.10 (#79650) * added cloud cold tier specific call out, probably wip * added jest test * rephrase copy * Added logic for showing/hiding data tier allocation option - Added server-side test for detecting legacy config - Added client-side test for asserting on cloud data tier option is hidden * added test for not-on-cloud case * Refactored logic for rendering data allocation notices Also updated a comment. * paraphrashing of Adams copy recommendation * Fix comment * address pr feedback * clarify slight hack comment * complete refactor of new flag for tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../__jest__/components/edit_policy.test.tsx | 119 +- .../common/types/api.ts | 8 + .../index_lifecycle_management/kibana.json | 1 + .../public/application/index.tsx | 10 +- .../cloud_data_tier_callout.tsx | 26 + .../data_tier_allocation.tsx | 66 +- .../default_allocation_notice.tsx | 9 +- .../components/data_tier_allocation/index.ts | 1 + .../no_node_attributes_warning.tsx | 21 +- .../components/data_tier_allocation/types.ts | 6 + .../shared/data_tier_allocation_field.tsx | 88 +- .../public/plugin.tsx | 5 +- .../public/shared_imports.ts | 10 + .../public/types.ts | 6 + .../routes/api/nodes/__jest__/fixtures.ts | 2295 +++++++++++++++++ .../__jest__/register_list_route.test.ts | 113 + .../routes/api/nodes/register_list_route.ts | 49 +- .../index_lifecycle_management/nodes.js | 1 + 18 files changed, 2746 insertions(+), 88 deletions(-) create mode 100644 x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/cloud_data_tier_callout.tsx create mode 100644 x-pack/plugins/index_lifecycle_management/public/shared_imports.ts create mode 100644 x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts create mode 100644 x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/register_list_route.test.ts diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.tsx b/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.tsx index dfbe19ba21a94..953e6244b077f 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.tsx +++ b/x-pack/plugins/index_lifecycle_management/__jest__/components/edit_policy.test.tsx @@ -21,8 +21,10 @@ import { fatalErrorsServiceMock, } from '../../../../../src/core/public/mocks'; import { usageCollectionPluginMock } from '../../../../../src/plugins/usage_collection/public/mocks'; +import { CloudSetup } from '../../../cloud/public'; import { EditPolicy } from '../../public/application/sections/edit_policy/edit_policy'; +import { KibanaContextProvider } from '../../public/shared_imports'; import { init as initHttp } from '../../public/application/services/http'; import { init as initUiMetric } from '../../public/application/services/ui_metric'; import { init as initNotification } from '../../public/application/services/notification'; @@ -148,7 +150,14 @@ const save = (rendered: ReactWrapper) => { describe('edit policy', () => { beforeEach(() => { component = ( - + + + ); ({ http } = editPolicyHelpers.setup()); @@ -447,6 +456,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: { data: ['node1'] }, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -495,6 +505,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: {}, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -507,6 +518,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: { data_hot: ['test'], data_cold: ['test'] }, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -519,6 +531,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: { data: ['test'] }, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -568,6 +581,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: { data: ['node1'] }, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -626,6 +640,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: {}, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -638,6 +653,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: { data_hot: ['test'], data_warm: ['test'] }, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -650,6 +666,7 @@ describe('edit policy', () => { http.setupNodeListResponse({ nodesByAttributes: {}, nodesByRoles: { data: ['test'] }, + isUsingDeprecatedDataRoleConfig: false, }); const rendered = mountWithIntl(component); noRollover(rendered); @@ -679,4 +696,104 @@ describe('edit policy', () => { expectedErrorMessages(rendered, [positiveNumberRequiredMessage]); }); }); + describe('not on cloud', () => { + beforeEach(() => { + server.respondImmediately = true; + }); + test('should show all allocation options, even if using legacy config', async () => { + http.setupNodeListResponse({ + nodesByAttributes: { test: ['123'] }, + nodesByRoles: { data: ['test'], data_hot: ['test'], data_warm: ['test'] }, + isUsingDeprecatedDataRoleConfig: true, + }); + const rendered = mountWithIntl(component); + noRollover(rendered); + setPolicyName(rendered, 'mypolicy'); + await activatePhase(rendered, 'warm'); + expect(rendered.find('.euiLoadingSpinner').exists()).toBeFalsy(); + + // Assert that only the custom and off options exist + findTestSubject(rendered, 'dataTierSelect').simulate('click'); + expect(findTestSubject(rendered, 'defaultDataAllocationOption').exists()).toBeTruthy(); + expect(findTestSubject(rendered, 'customDataAllocationOption').exists()).toBeTruthy(); + expect(findTestSubject(rendered, 'noneDataAllocationOption').exists()).toBeTruthy(); + }); + }); + describe('on cloud', () => { + beforeEach(() => { + component = ( + + + + ); + ({ http } = editPolicyHelpers.setup()); + ({ server, httpRequestsMockHelpers } = http); + server.respondImmediately = true; + + httpRequestsMockHelpers.setPoliciesResponse(policies); + }); + + describe('with legacy data role config', () => { + test('should hide data tier option on cloud using legacy node role configuration', async () => { + http.setupNodeListResponse({ + nodesByAttributes: { test: ['123'] }, + nodesByRoles: { data: ['test'], data_hot: ['test'], data_warm: ['test'] }, + isUsingDeprecatedDataRoleConfig: true, + }); + const rendered = mountWithIntl(component); + noRollover(rendered); + setPolicyName(rendered, 'mypolicy'); + await activatePhase(rendered, 'warm'); + expect(rendered.find('.euiLoadingSpinner').exists()).toBeFalsy(); + + // Assert that only the custom and off options exist + findTestSubject(rendered, 'dataTierSelect').simulate('click'); + expect(findTestSubject(rendered, 'defaultDataAllocationOption').exists()).toBeFalsy(); + expect(findTestSubject(rendered, 'customDataAllocationOption').exists()).toBeTruthy(); + expect(findTestSubject(rendered, 'noneDataAllocationOption').exists()).toBeTruthy(); + }); + }); + + describe('with node role config', () => { + test('should show off, custom and data role options on cloud with data roles', async () => { + http.setupNodeListResponse({ + nodesByAttributes: { test: ['123'] }, + nodesByRoles: { data: ['test'], data_hot: ['test'], data_warm: ['test'] }, + isUsingDeprecatedDataRoleConfig: false, + }); + const rendered = mountWithIntl(component); + noRollover(rendered); + setPolicyName(rendered, 'mypolicy'); + await activatePhase(rendered, 'warm'); + expect(rendered.find('.euiLoadingSpinner').exists()).toBeFalsy(); + + findTestSubject(rendered, 'dataTierSelect').simulate('click'); + expect(findTestSubject(rendered, 'defaultDataAllocationOption').exists()).toBeTruthy(); + expect(findTestSubject(rendered, 'customDataAllocationOption').exists()).toBeTruthy(); + expect(findTestSubject(rendered, 'noneDataAllocationOption').exists()).toBeTruthy(); + }); + + test('should show cloud notice when cold tier nodes do not exist', async () => { + http.setupNodeListResponse({ + nodesByAttributes: {}, + nodesByRoles: { data: ['test'], data_hot: ['test'], data_warm: ['test'] }, + isUsingDeprecatedDataRoleConfig: false, + }); + const rendered = mountWithIntl(component); + noRollover(rendered); + setPolicyName(rendered, 'mypolicy'); + await activatePhase(rendered, 'cold'); + expect(rendered.find('.euiLoadingSpinner').exists()).toBeFalsy(); + expect(findTestSubject(rendered, 'cloudDataTierCallout').exists()).toBeTruthy(); + // Assert that other notices are not showing + expect(findTestSubject(rendered, 'defaultAllocationNotice').exists()).toBeFalsy(); + expect(findTestSubject(rendered, 'noNodeAttributesWarning').exists()).toBeFalsy(); + }); + }); + }); }); diff --git a/x-pack/plugins/index_lifecycle_management/common/types/api.ts b/x-pack/plugins/index_lifecycle_management/common/types/api.ts index fcdbdf2c9cc90..ccdd7fcb11778 100644 --- a/x-pack/plugins/index_lifecycle_management/common/types/api.ts +++ b/x-pack/plugins/index_lifecycle_management/common/types/api.ts @@ -9,4 +9,12 @@ import { NodeDataRoleWithCatchAll } from '.'; export interface ListNodesRouteResponse { nodesByAttributes: { [attributePair: string]: string[] }; nodesByRoles: { [role in NodeDataRoleWithCatchAll]?: string[] }; + + /** + * A flag to indicate whether a node is using `settings.node.data` which is the now deprecated way cloud configured + * nodes to have data (and other) roles. + * + * If this is true, it means the cluster is using legacy cloud configuration for data allocation, not node roles. + */ + isUsingDeprecatedDataRoleConfig: boolean; } diff --git a/x-pack/plugins/index_lifecycle_management/kibana.json b/x-pack/plugins/index_lifecycle_management/kibana.json index 479d651fc6698..1b0a73c6a0133 100644 --- a/x-pack/plugins/index_lifecycle_management/kibana.json +++ b/x-pack/plugins/index_lifecycle_management/kibana.json @@ -9,6 +9,7 @@ "features" ], "optionalPlugins": [ + "cloud", "usageCollection", "indexManagement", "home" diff --git a/x-pack/plugins/index_lifecycle_management/public/application/index.tsx b/x-pack/plugins/index_lifecycle_management/public/application/index.tsx index d7812f186a03f..7a7fd20e96c63 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/index.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/index.tsx @@ -8,6 +8,9 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { I18nStart, ScopedHistory, ApplicationStart } from 'kibana/public'; import { UnmountCallback } from 'src/core/public'; +import { CloudSetup } from '../../../cloud/public'; + +import { KibanaContextProvider } from '../shared_imports'; import { App } from './app'; @@ -16,11 +19,14 @@ export const renderApp = ( I18nContext: I18nStart['Context'], history: ScopedHistory, navigateToApp: ApplicationStart['navigateToApp'], - getUrlForApp: ApplicationStart['getUrlForApp'] + getUrlForApp: ApplicationStart['getUrlForApp'], + cloud?: CloudSetup ): UnmountCallback => { render( - + + + , element ); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/cloud_data_tier_callout.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/cloud_data_tier_callout.tsx new file mode 100644 index 0000000000000..2dff55ac10de1 --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/cloud_data_tier_callout.tsx @@ -0,0 +1,26 @@ +/* + * 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 React, { FunctionComponent } from 'react'; +import { EuiCallOut } from '@elastic/eui'; + +const i18nTexts = { + title: i18n.translate('xpack.indexLifecycleMgmt.editPolicy.cloudDataTierCallout.title', { + defaultMessage: 'Create a cold tier', + }), + body: i18n.translate('xpack.indexLifecycleMgmt.editPolicy.cloudDataTierCallout.body', { + defaultMessage: 'Edit your Elastic Cloud deployment to set up a cold tier.', + }), +}; + +export const CloudDataTierCallout: FunctionComponent = () => { + return ( + + {i18nTexts.body} + + ); +}; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/data_tier_allocation.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/data_tier_allocation.tsx index 4ec488f95c94d..f58f36fc45a0c 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/data_tier_allocation.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/data_tier_allocation.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { FunctionComponent } from 'react'; +import React, { FunctionComponent, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiText, EuiFormRow, EuiSpacer, EuiSuperSelect, EuiSuperSelectOption } from '@elastic/eui'; @@ -90,7 +90,25 @@ const i18nTexts = { }; export const DataTierAllocation: FunctionComponent = (props) => { - const { phaseData, setPhaseData, phase, hasNodeAttributes } = props; + const { phaseData, setPhaseData, phase, hasNodeAttributes, disableDataTierOption } = props; + + useEffect(() => { + if (disableDataTierOption && phaseData.dataTierAllocationType === 'default') { + /** + * @TODO + * This is a slight hack because we only know we should disable the "default" option further + * down the component tree (i.e., after the policy has been deserialized). + * + * We reset the value to "custom" if we deserialized to "default". + * + * It would be better if we had all the information we needed before deserializing and + * were able to handle this at the deserialization step instead of patching further down + * the component tree - this should be a future refactor. + */ + setPhaseData('dataTierAllocationType', 'custom'); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); return (
@@ -102,21 +120,40 @@ export const DataTierAllocation: FunctionComponent = (props) => { onChange={(value) => setPhaseData('dataTierAllocationType', value)} options={ [ + disableDataTierOption + ? undefined + : { + 'data-test-subj': 'defaultDataAllocationOption', + value: 'default', + inputDisplay: i18nTexts.allocationOptions[phase].default.input, + dropdownDisplay: ( + <> + {i18nTexts.allocationOptions[phase].default.input} + +

+ {i18nTexts.allocationOptions[phase].default.helpText} +

+
+ + ), + }, { - value: 'default', - inputDisplay: i18nTexts.allocationOptions[phase].default.input, + 'data-test-subj': 'customDataAllocationOption', + value: 'custom', + inputDisplay: i18nTexts.allocationOptions[phase].custom.inputDisplay, dropdownDisplay: ( <> - {i18nTexts.allocationOptions[phase].default.input} + {i18nTexts.allocationOptions[phase].custom.inputDisplay}

- {i18nTexts.allocationOptions[phase].default.helpText} + {i18nTexts.allocationOptions[phase].custom.helpText}

), }, { + 'data-test-subj': 'noneDataAllocationOption', value: 'none', inputDisplay: i18nTexts.allocationOptions[phase].none.inputDisplay, dropdownDisplay: ( @@ -130,22 +167,7 @@ export const DataTierAllocation: FunctionComponent = (props) => { ), }, - { - 'data-test-subj': 'customDataAllocationOption', - value: 'custom', - inputDisplay: i18nTexts.allocationOptions[phase].custom.inputDisplay, - dropdownDisplay: ( - <> - {i18nTexts.allocationOptions[phase].custom.inputDisplay} - -

- {i18nTexts.allocationOptions[phase].custom.helpText} -

-
- - ), - }, - ] as SelectOptions[] + ].filter(Boolean) as SelectOptions[] } /> diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/default_allocation_notice.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/default_allocation_notice.tsx index 8faa9bb2972c2..42f9e8494a0b3 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/default_allocation_notice.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/default_allocation_notice.tsx @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import React, { FunctionComponent } from 'react'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { EuiCallOut } from '@elastic/eui'; import { PhaseWithAllocation, NodeDataRole } from '../../../../../../common/types'; @@ -102,10 +102,5 @@ export const DefaultAllocationNotice: FunctionComponent = ({ phase, targe ); - return ( - <> - - {content} - - ); + return content; }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/index.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/index.ts index dcbdf960fd380..937e3dd28da97 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/index.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/index.ts @@ -10,3 +10,4 @@ export { NodeAttrsDetails } from './node_attrs_details'; export { DataTierAllocation } from './data_tier_allocation'; export { DefaultAllocationNotice } from './default_allocation_notice'; export { NoNodeAttributesWarning } from './no_node_attributes_warning'; +export { CloudDataTierCallout } from './cloud_data_tier_callout'; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/no_node_attributes_warning.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/no_node_attributes_warning.tsx index ceccc51f95c1f..69185277f64ce 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/no_node_attributes_warning.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/no_node_attributes_warning.tsx @@ -5,7 +5,7 @@ */ import React, { FunctionComponent } from 'react'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { EuiCallOut } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { PhaseWithAllocation } from '../../../../../../common/types'; @@ -38,16 +38,13 @@ export const NoNodeAttributesWarning: FunctionComponent<{ phase: PhaseWithAlloca phase, }) => { return ( - <> - - - {i18nTexts[phase].body} - - + + {i18nTexts[phase].body} + ); }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/types.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/types.ts index d4cb31a3be9e7..d3dd536d97df0 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/types.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/data_tier_allocation/types.ts @@ -19,4 +19,10 @@ export interface SharedProps { isShowingErrors: boolean; nodes: ListNodesRouteResponse['nodesByAttributes']; hasNodeAttributes: boolean; + /** + * When on Cloud we want to disable the data tier allocation option when we detect that we are not + * using node roles in our Node config yet. See {@link ListNodesRouteResponse} for information about how this is + * detected. + */ + disableDataTierOption: boolean; } diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/phases/shared/data_tier_allocation_field.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/phases/shared/data_tier_allocation_field.tsx index 623d443a1db01..b3772a6e3ebd4 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/phases/shared/data_tier_allocation_field.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/phases/shared/data_tier_allocation_field.tsx @@ -6,8 +6,9 @@ import React, { FunctionComponent } from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; +import { EuiDescribedFormGroup, EuiFormRow, EuiSpacer } from '@elastic/eui'; +import { useKibana } from '../../../../../shared_imports'; import { PhaseWithAllocationAction, PhaseWithAllocation } from '../../../../../../common/types'; import { PhaseValidationErrors } from '../../../../services/policies/policy_validation'; import { getAvailableNodeRoleForPhase } from '../../../../lib/data_tiers'; @@ -18,6 +19,7 @@ import { DefaultAllocationNotice, NoNodeAttributesWarning, NodesDataProvider, + CloudDataTierCallout, } from '../../components/data_tier_allocation'; const i18nTexts = { @@ -46,35 +48,61 @@ export const DataTierAllocationField: FunctionComponent = ({ isShowingErrors, errors, }) => { + const { + services: { cloud }, + } = useKibana(); + return ( - {(nodesData) => { - const hasNodeAttrs = Boolean(Object.keys(nodesData.nodesByAttributes ?? {}).length); - - const renderDefaultAllocationNotice = () => { - if (phaseData.dataTierAllocationType !== 'default') { - return null; - } + {({ nodesByRoles, nodesByAttributes, isUsingDeprecatedDataRoleConfig }) => { + const hasNodeAttrs = Boolean(Object.keys(nodesByAttributes ?? {}).length); - const allocationNodeRole = getAvailableNodeRoleForPhase(phase, nodesData.nodesByRoles); - if ( - allocationNodeRole !== 'none' && - isNodeRoleFirstPreference(phase, allocationNodeRole) - ) { - return null; - } + const renderNotice = () => { + switch (phaseData.dataTierAllocationType) { + case 'default': + const isCloudEnabled = cloud?.isCloudEnabled ?? false; + const isUsingNodeRoles = !isUsingDeprecatedDataRoleConfig; + if ( + isCloudEnabled && + isUsingNodeRoles && + phase === 'cold' && + !nodesByRoles.data_cold?.length + ) { + // Tell cloud users they can deploy cold tier nodes. + return ( + <> + + + + ); + } - return ; - }; - - const renderNodeAttributesWarning = () => { - if (phaseData.dataTierAllocationType !== 'custom') { - return null; - } - if (hasNodeAttrs) { - return null; + const allocationNodeRole = getAvailableNodeRoleForPhase(phase, nodesByRoles); + if ( + allocationNodeRole === 'none' || + !isNodeRoleFirstPreference(phase, allocationNodeRole) + ) { + return ( + <> + + + + ); + } + break; + case 'custom': + if (!hasNodeAttrs) { + return ( + <> + + + + ); + } + break; + default: + return null; } - return ; }; return ( @@ -92,12 +120,14 @@ export const DataTierAllocationField: FunctionComponent = ({ setPhaseData={setPhaseData} phaseData={phaseData} isShowingErrors={isShowingErrors} - nodes={nodesData.nodesByAttributes} + nodes={nodesByAttributes} + disableDataTierOption={ + !!(isUsingDeprecatedDataRoleConfig && cloud?.isCloudEnabled) + } /> - {/* Data tier related warnings */} - {renderDefaultAllocationNotice()} - {renderNodeAttributesWarning()} + {/* Data tier related warnings and call-to-action notices */} + {renderNotice()} diff --git a/x-pack/plugins/index_lifecycle_management/public/plugin.tsx b/x-pack/plugins/index_lifecycle_management/public/plugin.tsx index 645a78bfc99b8..24ce036c0e058 100644 --- a/x-pack/plugins/index_lifecycle_management/public/plugin.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/plugin.tsx @@ -31,7 +31,7 @@ export class IndexLifecycleManagementPlugin { getStartServices, } = coreSetup; - const { usageCollection, management, indexManagement, home } = plugins; + const { usageCollection, management, indexManagement, home, cloud } = plugins; // Initialize services even if the app isn't mounted, because they're used by index management extensions. initHttp(http); @@ -65,7 +65,8 @@ export class IndexLifecycleManagementPlugin { I18nContext, history, navigateToApp, - getUrlForApp + getUrlForApp, + cloud ); return () => { diff --git a/x-pack/plugins/index_lifecycle_management/public/shared_imports.ts b/x-pack/plugins/index_lifecycle_management/public/shared_imports.ts new file mode 100644 index 0000000000000..d479b821ceefc --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/public/shared_imports.ts @@ -0,0 +1,10 @@ +/* + * 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 { AppServicesContext } from './types'; +import { useKibana as _useKibana } from '../../../../src/plugins/kibana_react/public'; + +export { KibanaContextProvider } from '../../../../src/plugins/kibana_react/public'; +export const useKibana = () => _useKibana(); diff --git a/x-pack/plugins/index_lifecycle_management/public/types.ts b/x-pack/plugins/index_lifecycle_management/public/types.ts index 65db00f1e68c1..c9b9b063cd45f 100644 --- a/x-pack/plugins/index_lifecycle_management/public/types.ts +++ b/x-pack/plugins/index_lifecycle_management/public/types.ts @@ -8,10 +8,12 @@ import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; import { ManagementSetup } from '../../../../src/plugins/management/public'; import { IndexManagementPluginSetup } from '../../index_management/public'; +import { CloudSetup } from '../../cloud/public'; export interface PluginsDependencies { usageCollection?: UsageCollectionSetup; management: ManagementSetup; + cloud?: CloudSetup; indexManagement?: IndexManagementPluginSetup; home?: HomePublicPluginSetup; } @@ -21,3 +23,7 @@ export interface ClientConfigType { enabled: boolean; }; } + +export interface AppServicesContext { + cloud?: CloudSetup; +} diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts new file mode 100644 index 0000000000000..e547c3f662432 --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts @@ -0,0 +1,2295 @@ +/* + * 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/naming-convention */ + +/** + * The fixtures below are from the "_nodes/settings" endpoint on a 7.9.2 Cloud-created cluster. + */ + +export const cloudNodeSettingsWithLegacy = { + _nodes: { + successful: 5, + failed: 0, + total: 5, + }, + cluster_name: '6ee9547c30214d278d2a63c4de98dea5', + nodes: { + t49k7mdeRIiELuOt_MOZ1g: { + transport_address: '10.47.32.43:19833', + name: 'instance-0000000002', + roles: ['data', 'ingest', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000002.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highstorage.1', + logical_availability_zone: 'zone-0', + data: 'warm', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000002', + master: 'false', + data: 'true', + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18120', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18120', + }, + network: { + publish_host: '10.47.32.43', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19833', + }, + profiles: { + client: { + port: '20296', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.32.43', + host: '10.47.32.43', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000002.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highstorage.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-0', + data: 'warm', + }, + build_type: 'docker', + }, + 'SgaCpsXAQu-oTsP4iLGZWw': { + transport_address: '10.47.32.33:19227', + name: 'tiebreaker-0000000004', + roles: ['master', 'remote_cluster_client', 'voting_only'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'tiebreaker-0000000004.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-b', + region: 'unknown-region', + transform: { + node: 'false', + }, + instance_configuration: 'gcp.master.1', + logical_availability_zone: 'tiebreaker', + data: 'hot', + }, + ml: 'false', + ingest: 'false', + name: 'tiebreaker-0000000004', + master: 'true', + voting_only: 'true', + data: 'false', + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18013', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18013', + }, + network: { + publish_host: '10.47.32.33', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19227', + }, + profiles: { + client: { + port: '20281', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.32.33', + host: '10.47.32.33', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'tiebreaker-0000000004.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-b', + 'transform.node': 'false', + region: 'unknown-region', + instance_configuration: 'gcp.master.1', + 'xpack.installed': 'true', + logical_availability_zone: 'tiebreaker', + data: 'hot', + }, + build_type: 'docker', + }, + 'ZVndRfrfSl-kmEyZgJu0JQ': { + transport_address: '10.47.47.205:19570', + name: 'instance-0000000001', + roles: ['data', 'ingest', 'master', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000001.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highio.1', + logical_availability_zone: 'zone-1', + data: 'hot', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000001', + master: 'true', + data: 'true', + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18760', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18760', + }, + network: { + publish_host: '10.47.47.205', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19570', + }, + profiles: { + client: { + port: '20803', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.47.205', + host: '10.47.47.205', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000001.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highio.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-1', + data: 'hot', + }, + build_type: 'docker', + }, + Tx8Xig60SIuitXhY0srD6Q: { + transport_address: '10.47.32.41:19901', + name: 'instance-0000000003', + roles: ['data', 'ingest', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000003.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highstorage.1', + logical_availability_zone: 'zone-1', + data: 'warm', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000003', + master: 'false', + data: 'true', + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18977', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18977', + }, + network: { + publish_host: '10.47.32.41', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19901', + }, + profiles: { + client: { + port: '20466', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.32.41', + host: '10.47.32.41', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000003.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highstorage.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-1', + data: 'warm', + }, + build_type: 'docker', + }, + Qtpmy7aBSIaOZisv9Q92TA: { + transport_address: '10.47.47.203:19498', + name: 'instance-0000000000', + roles: ['data', 'ingest', 'master', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000000.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highio.1', + logical_availability_zone: 'zone-0', + data: 'hot', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000000', + master: 'true', + data: 'true', + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18221', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18221', + }, + network: { + publish_host: '10.47.47.203', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19498', + }, + profiles: { + client: { + port: '20535', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.47.203', + host: '10.47.47.203', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000000.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highio.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-0', + data: 'hot', + }, + build_type: 'docker', + }, + }, +}; + +export const cloudNodeSettingsWithoutLegacy = { + _nodes: { + successful: 5, + failed: 0, + total: 5, + }, + cluster_name: '6ee9547c30214d278d2a63c4de98dea5', + nodes: { + t49k7mdeRIiELuOt_MOZ1g: { + transport_address: '10.47.32.43:19833', + name: 'instance-0000000002', + roles: ['data', 'ingest', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000002.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highstorage.1', + logical_availability_zone: 'zone-0', + data: 'warm', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000002', + master: 'false', + data: undefined, + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18120', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18120', + }, + network: { + publish_host: '10.47.32.43', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19833', + }, + profiles: { + client: { + port: '20296', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.32.43', + host: '10.47.32.43', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000002.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highstorage.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-0', + data: 'warm', + }, + build_type: 'docker', + }, + 'SgaCpsXAQu-oTsP4iLGZWw': { + transport_address: '10.47.32.33:19227', + name: 'tiebreaker-0000000004', + roles: ['master', 'remote_cluster_client', 'voting_only'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'tiebreaker-0000000004.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-b', + region: 'unknown-region', + transform: { + node: 'false', + }, + instance_configuration: 'gcp.master.1', + logical_availability_zone: 'tiebreaker', + data: 'hot', + }, + ml: 'false', + ingest: 'false', + name: 'tiebreaker-0000000004', + master: 'true', + voting_only: 'true', + data: 'false', + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18013', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18013', + }, + network: { + publish_host: '10.47.32.33', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19227', + }, + profiles: { + client: { + port: '20281', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.32.33', + host: '10.47.32.33', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'tiebreaker-0000000004.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-b', + 'transform.node': 'false', + region: 'unknown-region', + instance_configuration: 'gcp.master.1', + 'xpack.installed': 'true', + logical_availability_zone: 'tiebreaker', + data: 'hot', + }, + build_type: 'docker', + }, + 'ZVndRfrfSl-kmEyZgJu0JQ': { + transport_address: '10.47.47.205:19570', + name: 'instance-0000000001', + roles: ['data', 'ingest', 'master', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000001.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highio.1', + logical_availability_zone: 'zone-1', + data: 'hot', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000001', + master: 'true', + data: undefined, + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18760', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18760', + }, + network: { + publish_host: '10.47.47.205', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19570', + }, + profiles: { + client: { + port: '20803', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.47.205', + host: '10.47.47.205', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000001.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highio.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-1', + data: 'hot', + }, + build_type: 'docker', + }, + Tx8Xig60SIuitXhY0srD6Q: { + transport_address: '10.47.32.41:19901', + name: 'instance-0000000003', + roles: ['data', 'ingest', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000003.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highstorage.1', + logical_availability_zone: 'zone-1', + data: 'warm', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000003', + master: 'false', + data: undefined, + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18977', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18977', + }, + network: { + publish_host: '10.47.32.41', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19901', + }, + profiles: { + client: { + port: '20466', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.32.41', + host: '10.47.32.41', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000003.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-a', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highstorage.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-1', + data: 'warm', + }, + build_type: 'docker', + }, + Qtpmy7aBSIaOZisv9Q92TA: { + transport_address: '10.47.47.203:19498', + name: 'instance-0000000000', + roles: ['data', 'ingest', 'master', 'remote_cluster_client', 'transform'], + settings: { + node: { + attr: { + xpack: { + installed: 'true', + }, + server_name: 'instance-0000000000.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + region: 'unknown-region', + transform: { + node: 'true', + }, + instance_configuration: 'gcp.data.highio.1', + logical_availability_zone: 'zone-0', + data: 'hot', + }, + ml: 'false', + ingest: 'true', + name: 'instance-0000000000', + master: 'true', + data: undefined, + pidfile: '/app/es.pid', + max_local_storage_nodes: '1', + }, + reindex: { + remote: { + whitelist: ['*.io:*', '*.com:*'], + }, + }, + http: { + compression: 'true', + type: 'security4', + max_warning_header_count: '64', + publish_port: '18221', + 'type.default': 'netty4', + max_warning_header_size: '7168b', + port: '18221', + }, + network: { + publish_host: '10.47.47.203', + bind_host: '_site:ipv4_', + }, + xpack: { + monitoring: { + collection: { + enabled: 'false', + }, + history: { + duration: '3d', + }, + }, + license: { + self_generated: { + type: 'trial', + }, + }, + ml: { + enabled: 'true', + }, + ccr: { + enabled: 'false', + }, + notification: { + email: { + account: { + work: { + email_defaults: { + from: 'Watcher Alert ', + }, + smtp: { + host: 'dockerhost', + port: '10025', + }, + }, + }, + }, + }, + security: { + authc: { + token: { + enabled: 'true', + }, + reserved_realm: { + enabled: 'false', + }, + realms: { + native: { + native: { + order: '1', + }, + }, + file: { + found: { + order: '0', + }, + }, + saml: { + 'cloud-saml-kibana-916c269173df465f9826f4471799de42': { + attributes: { + name: 'http://saml.elastic-cloud.com/attributes/name', + groups: 'http://saml.elastic-cloud.com/attributes/roles', + principal: 'http://saml.elastic-cloud.com/attributes/principal', + }, + sp: { + acs: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', + logout: + 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', + }, + order: '3', + idp: { + entity_id: 'urn:idp-cloud-elastic-co', + metadata: { + path: + '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + }, + }, + }, + }, + }, + anonymous: { + username: 'anonymous', + authz_exception: 'false', + roles: 'anonymous', + }, + }, + enabled: 'true', + http: { + ssl: { + enabled: 'true', + }, + }, + transport: { + ssl: { + enabled: 'true', + }, + }, + }, + }, + script: { + allowed_types: 'stored,inline', + }, + cluster: { + routing: { + allocation: { + disk: { + threshold_enabled: 'true', + watermark: { + enable_for_single_data_node: 'true', + }, + }, + awareness: { + attributes: 'region,logical_availability_zone', + }, + }, + }, + name: '6ee9547c30214d278d2a63c4de98dea5', + initial_master_nodes: 'instance-0000000000,instance-0000000001,tiebreaker-0000000004', + election: { + strategy: 'supports_voting_only', + }, + indices: { + close: { + enable: 'true', + }, + }, + metadata: { + managed_policies: ['cloud-snapshot-policy'], + managed_repository: 'found-snapshots', + managed_index_templates: '.cloud-', + }, + }, + client: { + type: 'node', + }, + action: { + auto_create_index: 'true', + destructive_requires_name: 'false', + }, + path: { + home: '/usr/share/elasticsearch', + data: ['/app/data'], + logs: '/app/logs', + }, + transport: { + 'type.default': 'netty4', + type: 'security4', + tcp: { + port: '19498', + }, + profiles: { + client: { + port: '20535', + }, + }, + features: { + 'x-pack': 'true', + }, + }, + discovery: { + seed_hosts: [], + seed_providers: 'file', + }, + }, + ip: '10.47.47.203', + host: '10.47.47.203', + version: '7.9.2', + build_flavor: 'default', + build_hash: 'd34da0ea4a966c4e49417f2da2f244e3e97b4e6e', + attributes: { + server_name: 'instance-0000000000.6ee9547c30214d278d2a63c4de98dea5', + availability_zone: 'europe-west4-c', + 'transform.node': 'true', + region: 'unknown-region', + instance_configuration: 'gcp.data.highio.1', + 'xpack.installed': 'true', + logical_availability_zone: 'zone-0', + data: 'hot', + }, + build_type: 'docker', + }, + }, +}; diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/register_list_route.test.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/register_list_route.test.ts new file mode 100644 index 0000000000000..5adb7763074fe --- /dev/null +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/register_list_route.test.ts @@ -0,0 +1,113 @@ +/* + * 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 { convertSettingsIntoLists } from '../register_list_route'; +import { cloudNodeSettingsWithLegacy, cloudNodeSettingsWithoutLegacy } from './fixtures'; + +describe('convertSettingsIntoLists', () => { + it('detects node role config', () => { + const result = convertSettingsIntoLists(cloudNodeSettingsWithoutLegacy, []); + expect(result.isUsingDeprecatedDataRoleConfig).toBe(false); + }); + + it('converts cloud settings into the expected response and detects deprecated config', () => { + const result = convertSettingsIntoLists(cloudNodeSettingsWithLegacy, []); + + expect(result.isUsingDeprecatedDataRoleConfig).toBe(true); + expect(result.nodesByRoles).toEqual({ + data: [ + 't49k7mdeRIiELuOt_MOZ1g', + 'ZVndRfrfSl-kmEyZgJu0JQ', + 'Tx8Xig60SIuitXhY0srD6Q', + 'Qtpmy7aBSIaOZisv9Q92TA', + ], + }); + expect(result.nodesByAttributes).toMatchInlineSnapshot(` + Object { + "availability_zone:europe-west4-a": Array [ + "ZVndRfrfSl-kmEyZgJu0JQ", + "Tx8Xig60SIuitXhY0srD6Q", + ], + "availability_zone:europe-west4-b": Array [ + "SgaCpsXAQu-oTsP4iLGZWw", + ], + "availability_zone:europe-west4-c": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "data:hot": Array [ + "SgaCpsXAQu-oTsP4iLGZWw", + "ZVndRfrfSl-kmEyZgJu0JQ", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "data:warm": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "Tx8Xig60SIuitXhY0srD6Q", + ], + "instance_configuration:gcp.data.highio.1": Array [ + "ZVndRfrfSl-kmEyZgJu0JQ", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "instance_configuration:gcp.data.highstorage.1": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "Tx8Xig60SIuitXhY0srD6Q", + ], + "instance_configuration:gcp.master.1": Array [ + "SgaCpsXAQu-oTsP4iLGZWw", + ], + "logical_availability_zone:tiebreaker": Array [ + "SgaCpsXAQu-oTsP4iLGZWw", + ], + "logical_availability_zone:zone-0": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "logical_availability_zone:zone-1": Array [ + "ZVndRfrfSl-kmEyZgJu0JQ", + "Tx8Xig60SIuitXhY0srD6Q", + ], + "region:unknown-region": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "SgaCpsXAQu-oTsP4iLGZWw", + "ZVndRfrfSl-kmEyZgJu0JQ", + "Tx8Xig60SIuitXhY0srD6Q", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "server_name:instance-0000000000.6ee9547c30214d278d2a63c4de98dea5": Array [ + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "server_name:instance-0000000001.6ee9547c30214d278d2a63c4de98dea5": Array [ + "ZVndRfrfSl-kmEyZgJu0JQ", + ], + "server_name:instance-0000000002.6ee9547c30214d278d2a63c4de98dea5": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + ], + "server_name:instance-0000000003.6ee9547c30214d278d2a63c4de98dea5": Array [ + "Tx8Xig60SIuitXhY0srD6Q", + ], + "server_name:tiebreaker-0000000004.6ee9547c30214d278d2a63c4de98dea5": Array [ + "SgaCpsXAQu-oTsP4iLGZWw", + ], + "transform.node:false": Array [ + "SgaCpsXAQu-oTsP4iLGZWw", + ], + "transform.node:true": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "ZVndRfrfSl-kmEyZgJu0JQ", + "Tx8Xig60SIuitXhY0srD6Q", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + "xpack.installed:true": Array [ + "t49k7mdeRIiELuOt_MOZ1g", + "SgaCpsXAQu-oTsP4iLGZWw", + "ZVndRfrfSl-kmEyZgJu0JQ", + "Tx8Xig60SIuitXhY0srD6Q", + "Qtpmy7aBSIaOZisv9Q92TA", + ], + } + `); + }); +}); diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts index f7f048e809d75..bb1679e695e14 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts @@ -9,22 +9,27 @@ import { ListNodesRouteResponse, NodeDataRole } from '../../../../common/types'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '../../../services'; -interface Stats { +interface Settings { nodes: { [nodeId: string]: { attributes: Record; roles: string[]; + settings: { + node: { + data?: string; + }; + }; }; }; } -function convertStatsIntoList( - stats: Stats, +export function convertSettingsIntoLists( + settings: Settings, disallowedNodeAttributes: string[] ): ListNodesRouteResponse { - return Object.entries(stats.nodes).reduce( - (accum, [nodeId, nodeStats]) => { - const attributes = nodeStats.attributes || {}; + return Object.entries(settings.nodes).reduce( + (accum, [nodeId, nodeSettings]) => { + const attributes = nodeSettings.attributes || {}; for (const [key, value] of Object.entries(attributes)) { const isNodeAttributeAllowed = !disallowedNodeAttributes.includes(key); if (isNodeAttributeAllowed) { @@ -34,14 +39,26 @@ function convertStatsIntoList( } } - const dataRoles = nodeStats.roles.filter((r) => r.startsWith('data')) as NodeDataRole[]; + const dataRoles = nodeSettings.roles.filter((r) => r.startsWith('data')) as NodeDataRole[]; for (const role of dataRoles) { accum.nodesByRoles[role as NodeDataRole] = accum.nodesByRoles[role] ?? []; accum.nodesByRoles[role as NodeDataRole]!.push(nodeId); } + + // If we detect a single node using legacy "data:true" setting we know we are not using data roles for + // data allocation. + if (nodeSettings.settings?.node?.data === 'true') { + accum.isUsingDeprecatedDataRoleConfig = true; + } + return accum; }, - { nodesByAttributes: {}, nodesByRoles: {} } as ListNodesRouteResponse + { + nodesByAttributes: {}, + nodesByRoles: {}, + // Start with assumption that we are not using deprecated config + isUsingDeprecatedDataRoleConfig: false, + } as ListNodesRouteResponse ); } @@ -64,11 +81,17 @@ export function registerListRoute({ router, config, license }: RouteDependencies { path: addBasePath('/nodes/list'), validate: false }, license.guardApiRoute(async (context, request, response) => { try { - const statsResponse = await context.core.elasticsearch.client.asCurrentUser.nodes.stats< - Stats - >(); - const body: ListNodesRouteResponse = convertStatsIntoList( - statsResponse.body, + const settingsResponse = await context.core.elasticsearch.client.asCurrentUser.transport.request( + { + method: 'GET', + path: '/_nodes/settings', + querystring: { + format: 'json', + }, + } + ); + const body: ListNodesRouteResponse = convertSettingsIntoLists( + settingsResponse.body as Settings, disallowedNodeAttributes ); return response.ok({ body }); diff --git a/x-pack/test/api_integration/apis/management/index_lifecycle_management/nodes.js b/x-pack/test/api_integration/apis/management/index_lifecycle_management/nodes.js index c859037597821..3de3a3279f77c 100644 --- a/x-pack/test/api_integration/apis/management/index_lifecycle_management/nodes.js +++ b/x-pack/test/api_integration/apis/management/index_lifecycle_management/nodes.js @@ -29,6 +29,7 @@ export default function ({ getService }) { const nodesIds = Object.keys(nodeStats.nodes); const { body } = await loadNodes().expect(200); + expect(body.isUsingDeprecatedDataRoleConfig).to.eql(false); expect(body.nodesByAttributes[NODE_CUSTOM_ATTRIBUTE]).to.eql(nodesIds); }); }); From a811b748152f3720a6c94e77edce208caa97caa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Tue, 13 Oct 2020 13:52:15 +0200 Subject: [PATCH 27/85] Explicitly add permission for every single feature (#80157) --- .../setup-custom-kibana-user-role.ts | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts b/x-pack/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts index b0083da69cf85..cf17c9dbbf2e3 100644 --- a/x-pack/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts +++ b/x-pack/plugins/apm/scripts/kibana-security/setup-custom-kibana-user-role.ts @@ -122,11 +122,69 @@ async function init() { }); await createRole({ roleName: KIBANA_READ_ROLE, - kibanaPrivileges: { base: ['read'] }, + kibanaPrivileges: { + feature: { + // core + discover: ['read'], + dashboard: ['read'], + canvas: ['read'], + ml: ['read'], + maps: ['read'], + graph: ['read'], + visualize: ['read'], + + // observability + logs: ['read'], + infrastructure: ['read'], + apm: ['read'], + uptime: ['read'], + + // security + siem: ['read'], + + // management + dev_tools: ['read'], + advancedSettings: ['read'], + indexPatterns: ['read'], + savedObjectsManagement: ['read'], + stackAlerts: ['read'], + ingestManager: ['read'], + actions: ['read'], + }, + }, }); await createRole({ roleName: KIBANA_WRITE_ROLE, - kibanaPrivileges: { base: ['all'] }, + kibanaPrivileges: { + feature: { + // core + discover: ['all'], + dashboard: ['all'], + canvas: ['all'], + ml: ['all'], + maps: ['all'], + graph: ['all'], + visualize: ['all'], + + // observability + logs: ['all'], + infrastructure: ['all'], + apm: ['all'], + uptime: ['all'], + + // security + siem: ['all'], + + // management + dev_tools: ['all'], + advancedSettings: ['all'], + indexPatterns: ['all'], + savedObjectsManagement: ['all'], + stackAlerts: ['all'], + ingestManager: ['all'], + actions: ['all'], + }, + }, }); // read access only to APM + apm index access From 27a6a6752d1b623872191e0c252fa5e8a1317dbe Mon Sep 17 00:00:00 2001 From: Bohdan Tsymbala Date: Tue, 13 Oct 2020 14:17:50 +0200 Subject: [PATCH 28/85] Added component to truncate text programmatically and add tooltips. (#80198) * Added component to truncate text programmatically and add tooltips. Changed all field text values to use this component. * Fixed build failures. * Switched from FC component to one without children Co-authored-by: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> * Added some docs for the shared component. * Updated snapshots. Co-authored-by: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> --- .../__snapshots__/index.test.tsx.snap | 6 +- .../components/item_details_card/index.tsx | 9 +- .../__snapshots__/index.test.tsx.snap | 117 + .../text_field_value/index.stories.tsx | 27 + .../text_field_value/index.test.tsx | 39 + .../components/text_field_value/index.tsx | 46 + .../__snapshots__/index.test.tsx.snap | 68 +- .../components/trusted_app_card/index.tsx | 61 +- .../__snapshots__/index.test.tsx.snap | 900 ++++---- .../__snapshots__/index.test.tsx.snap | 1950 ++++++++++++----- .../components/trusted_apps_list/index.tsx | 28 +- .../pages/trusted_apps/view/translations.ts | 14 +- 12 files changed, 2251 insertions(+), 1014 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/common/components/text_field_value/__snapshots__/index.test.tsx.snap create mode 100644 x-pack/plugins/security_solution/public/common/components/text_field_value/index.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/text_field_value/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/text_field_value/index.tsx diff --git a/x-pack/plugins/security_solution/public/common/components/item_details_card/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/item_details_card/__snapshots__/index.test.tsx.snap index 61e9dd04d910d..4bd2cd05d49d0 100644 --- a/x-pack/plugins/security_solution/public/common/components/item_details_card/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/item_details_card/__snapshots__/index.test.tsx.snap @@ -200,11 +200,7 @@ exports[`item_details_card ItemDetailsPropertySummary should render correctly 1` name 1 - - value 1 - + value 1 `; diff --git a/x-pack/plugins/security_solution/public/common/components/item_details_card/index.tsx b/x-pack/plugins/security_solution/public/common/components/item_details_card/index.tsx index 9105514b75807..c41c5f89c0068 100644 --- a/x-pack/plugins/security_solution/public/common/components/item_details_card/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/item_details_card/index.tsx @@ -66,16 +66,13 @@ const DescriptionListDescription = styled(EuiDescriptionListDescription)` interface ItemDetailsPropertySummaryProps { name: ReactNode | ReactNode[]; value: ReactNode | ReactNode[]; - title?: string; } -export const ItemDetailsPropertySummary: FC = memo( - ({ name, value, title = '' }) => ( +export const ItemDetailsPropertySummary = memo( + ({ name, value }) => ( <> {name} - - {value} - + {value} ) ); diff --git a/x-pack/plugins/security_solution/public/common/components/text_field_value/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/text_field_value/__snapshots__/index.test.tsx.snap new file mode 100644 index 0000000000000..1e34c1daeea31 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/text_field_value/__snapshots__/index.test.tsx.snap @@ -0,0 +1,117 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`text_field_value TextFieldValue should render long text correctly, when there is limit 1`] = ` + + + field 1 + + + super long text part 0 super long text part 1 super long text part 2 super long text part 3 super long text part 4 super long text part 5 super long text part 6 super long text part 7 super long text part 8 super long text part 9 super long text part 10 super long text part 11 super long text part 12 super long text part 13 super long text part 14 super long text part 15 super long text part 16 super long text part 17 super long text part 18 super long text part 19 + + + } + delay="regular" + position="top" +> + + super long text part 0 super long text part 1 super long text part 2 super long text part 3 sup... + + +`; + +exports[`text_field_value TextFieldValue should render long text correctly, when there is no limit 1`] = ` + + + field 1 + + + super long text part 0 super long text part 1 super long text part 2 super long text part 3 super long text part 4 super long text part 5 super long text part 6 super long text part 7 super long text part 8 super long text part 9 super long text part 10 super long text part 11 super long text part 12 super long text part 13 super long text part 14 super long text part 15 super long text part 16 super long text part 17 super long text part 18 super long text part 19 + + + } + delay="regular" + position="top" +> + + super long text part 0 super long text part 1 super long text part 2 super long text part 3 super long text part 4 super long text part 5 super long text part 6 super long text part 7 super long text part 8 super long text part 9 super long text part 10 super long text part 11 super long text part 12 super long text part 13 super long text part 14 super long text part 15 super long text part 16 super long text part 17 super long text part 18 super long text part 19 + + +`; + +exports[`text_field_value TextFieldValue should render small text correctly, when there is limit 1`] = ` + + + field 1 + + + value 1 + + + } + delay="regular" + position="top" +> + + value 1 + + +`; + +exports[`text_field_value TextFieldValue should render small text correctly, when there is no limit 1`] = ` + + + field 1 + + + value 1 + + + } + delay="regular" + position="top" +> + + value 1 + + +`; diff --git a/x-pack/plugins/security_solution/public/common/components/text_field_value/index.stories.tsx b/x-pack/plugins/security_solution/public/common/components/text_field_value/index.stories.tsx new file mode 100644 index 0000000000000..cd0a4fcd65610 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/text_field_value/index.stories.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { storiesOf, addDecorator } from '@storybook/react'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { TextFieldValue } from '.'; + +addDecorator((storyFn) => ( + ({ eui: euiLightVars, darkMode: false })}>{storyFn()} +)); + +const longText = [...new Array(20).keys()].map((i) => ` super long text part ${i}`).join(' '); + +storiesOf('Components/TextFieldValue', module) + .add('short text, no limit', () => ) + .add('short text, with limit', () => ( + + )) + .add('long text, no limit', () => ) + .add('long text, with limit', () => ( + + )); diff --git a/x-pack/plugins/security_solution/public/common/components/text_field_value/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/text_field_value/index.test.tsx new file mode 100644 index 0000000000000..3ea1ae6d05ad2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/text_field_value/index.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { shallow } from 'enzyme'; +import React from 'react'; + +import { TextFieldValue } from '.'; + +describe('text_field_value', () => { + describe('TextFieldValue', () => { + const longText = [...new Array(20).keys()].map((i) => ` super long text part ${i}`).join(' '); + + it('should render small text correctly, when there is no limit', () => { + expect(shallow()).toMatchSnapshot(); + }); + + it('should render small text correctly, when there is limit', () => { + const element = shallow( + + ); + + expect(element).toMatchSnapshot(); + }); + + it('should render long text correctly, when there is no limit', () => { + expect(shallow()).toMatchSnapshot(); + }); + + it('should render long text correctly, when there is limit', () => { + const element = shallow( + + ); + + expect(element).toMatchSnapshot(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/text_field_value/index.tsx b/x-pack/plugins/security_solution/public/common/components/text_field_value/index.tsx new file mode 100644 index 0000000000000..8b482215f24fd --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/text_field_value/index.tsx @@ -0,0 +1,46 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; +import React from 'react'; + +const trimTextOverflow = (text: string, maxLength?: number) => { + if (maxLength !== undefined && text.length > maxLength) { + return `${text.substr(0, maxLength)}...`; + } else { + return text; + } +}; + +interface Props { + fieldName: string; + value: string; + maxLength?: number; + className?: string; +} + +/* + * Component to display text field value. Text field values can be large and need + * programmatic truncation to a fixed text length. As text can be truncated the tooltip + * is shown displaying the field name and full value. If the use case allows single + * line truncation with CSS use eui-textTruncate class on this component instead of + * maxLength property. + */ +export const TextFieldValue = ({ fieldName, value, maxLength, className }: Props) => { + return ( + + {fieldName} + {value} + + } + > + {trimTextOverflow(value, maxLength)} + + ); +}; diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_app_card/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_app_card/__snapshots__/index.test.tsx.snap index 5739281426f9a..53c9f7ddc9760 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_app_card/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_app_card/__snapshots__/index.test.tsx.snap @@ -4,12 +4,22 @@ exports[`trusted_app_card TrustedAppCard should render correctly 1`] = ` + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> { - if (text.length > maxSize) { - return `${text.substr(0, maxSize)}...`; - } else { - return text; - } -}; - const getEntriesColumnDefinitions = (): Array> => [ { field: 'field', @@ -49,7 +42,7 @@ const getEntriesColumnDefinitions = (): Array truncateText: true, textOnly: true, width: '30%', - render(field: MacosLinuxConditionEntry['field'], entry: Entry) { + render(field: Entry['field'], entry: Entry) { return CONDITION_FIELD_TITLE[field]; }, }, @@ -59,18 +52,24 @@ const getEntriesColumnDefinitions = (): Array sortable: false, truncateText: true, width: '20%', - render() { - return i18n.translate('xpack.securitySolution.trustedapps.card.operator.includes', { - defaultMessage: 'is', - }); + render(field: Entry['operator'], entry: Entry) { + return OPERATOR_TITLE[field]; }, }, { field: 'value', name: ENTRY_PROPERTY_TITLES.value, sortable: false, - truncateText: true, width: '60%', + render(field: Entry['value'], entry: Entry) { + return ( + + ); + }, }, ]; @@ -86,10 +85,18 @@ export const TrustedAppCard = memo(({ trustedApp, onDelete }: TrustedAppCardProp trimTextOverflow(trustedApp.name || '', 100), [trustedApp.name])} - title={trustedApp.name} + value={ + + } + /> + } /> - } /> - + + } + /> trimTextOverflow(trustedApp.description || '', 100), [ - trustedApp.description, - ])} - title={trustedApp.description} + value={ + + } /> - trusted app 0 + + trusted app 0 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 0 + + Trusted App 0 + @@ -386,9 +390,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 1 + + trusted app 1 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 1 + + Trusted App 1 + @@ -646,9 +654,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 2 + + trusted app 2 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 2 + + Trusted App 2 + @@ -906,9 +918,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 3 + + trusted app 3 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 3 + + Trusted App 3 + @@ -1166,9 +1182,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 4 + + trusted app 4 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 4 + + Trusted App 4 + @@ -1426,9 +1446,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 5 + + trusted app 5 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 5 + + Trusted App 5 + @@ -1686,9 +1710,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 6 + + trusted app 6 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 6 + + Trusted App 6 + @@ -1946,9 +1974,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 7 + + trusted app 7 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 7 + + Trusted App 7 + @@ -2206,9 +2238,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 8 + + trusted app 8 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 8 + + Trusted App 8 + @@ -2466,9 +2502,11 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = ` class="euiDescriptionList__description c2" > - trusted app 9 + + trusted app 9 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 9 + + Trusted App 9 + @@ -3004,9 +3044,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 0 + + trusted app 0 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 0 + + Trusted App 0 + @@ -3264,9 +3308,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 1 + + trusted app 1 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 1 + + Trusted App 1 + @@ -3524,9 +3572,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 2 + + trusted app 2 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 2 + + Trusted App 2 + @@ -3784,9 +3836,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 3 + + trusted app 3 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 3 + + Trusted App 3 + @@ -4044,9 +4100,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 4 + + trusted app 4 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 4 + + Trusted App 4 + @@ -4304,9 +4364,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 5 + + trusted app 5 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 5 + + Trusted App 5 + @@ -4564,9 +4628,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 6 + + trusted app 6 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 6 + + Trusted App 6 + @@ -4824,9 +4892,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 7 + + trusted app 7 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 7 + + Trusted App 7 + @@ -5084,9 +5156,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 8 + + trusted app 8 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 8 + + Trusted App 8 + @@ -5344,9 +5420,11 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time class="euiDescriptionList__description c2" > - trusted app 9 + + trusted app 9 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 9 + + Trusted App 9 + @@ -5846,9 +5926,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 0 + + trusted app 0 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 0 + + Trusted App 0 + @@ -6106,9 +6190,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 1 + + trusted app 1 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 1 + + Trusted App 1 + @@ -6366,9 +6454,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 2 + + trusted app 2 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 2 + + Trusted App 2 + @@ -6626,9 +6718,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 3 + + trusted app 3 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 3 + + Trusted App 3 + @@ -6886,9 +6982,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 4 + + trusted app 4 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 4 + + Trusted App 4 + @@ -7146,9 +7246,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 5 + + trusted app 5 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 5 + + Trusted App 5 + @@ -7406,9 +7510,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 6 + + trusted app 6 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 6 + + Trusted App 6 + @@ -7666,9 +7774,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 7 + + trusted app 7 +
- Mac OS + + Mac OS +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 7 + + Trusted App 7 + @@ -7926,9 +8038,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 8 + + trusted app 8 +
- Linux + + Linux +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 8 + + Trusted App 8 + @@ -8186,9 +8302,11 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not class="euiDescriptionList__description c2" > - trusted app 9 + + trusted app 9 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 9 + + Trusted App 9 + diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/__snapshots__/index.test.tsx.snap index 794fba9cd7dd7..181b59c65a3d5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/__snapshots__/index.test.tsx.snap @@ -647,12 +647,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 0 + + trusted app 0 +
@@ -667,7 +669,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -792,9 +802,11 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` class="euiDescriptionList__description c2" > - trusted app 0 + + trusted app 0 +
- Windows + + Windows +
- - 1 minute ago - + 1 minute ago
- someone + + someone +
- Trusted App 0 + + Trusted App 0 + @@ -1033,12 +1047,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 1 + + trusted app 1 +
@@ -1053,7 +1069,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -1152,12 +1176,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 2 + + trusted app 2 +
@@ -1172,7 +1198,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -1271,12 +1305,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 3 + + trusted app 3 +
@@ -1291,7 +1327,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -1390,12 +1434,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 4 + + trusted app 4 +
@@ -1410,7 +1456,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -1509,12 +1563,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 5 + + trusted app 5 +
@@ -1529,7 +1585,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -1628,12 +1692,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 6 + + trusted app 6 +
@@ -1648,7 +1714,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -1747,12 +1821,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 7 + + trusted app 7 +
@@ -1767,7 +1843,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -1866,12 +1950,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 8 + + trusted app 8 +
@@ -1886,7 +1972,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -1985,12 +2079,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 9 + + trusted app 9 +
@@ -2005,7 +2101,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -2104,12 +2208,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 10 + + trusted app 10 +
@@ -2124,7 +2230,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -2223,12 +2337,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 11 + + trusted app 11 +
@@ -2243,7 +2359,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -2342,12 +2466,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 12 + + trusted app 12 +
@@ -2362,7 +2488,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -2461,12 +2595,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 13 + + trusted app 13 +
@@ -2481,7 +2617,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -2580,12 +2724,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 14 + + trusted app 14 +
@@ -2600,7 +2746,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -2699,12 +2853,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 15 + + trusted app 15 +
@@ -2719,7 +2875,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -2818,12 +2982,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 16 + + trusted app 16 +
@@ -2838,7 +3004,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -2937,12 +3111,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 17 + + trusted app 17 +
@@ -2957,7 +3133,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -3056,12 +3240,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 18 + + trusted app 18 +
@@ -3076,7 +3262,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -3175,12 +3369,14 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = ` Name
- trusted app 19 + + trusted app 19 +
@@ -3195,7 +3391,13 @@ exports[`TrustedAppsList renders correctly when item details expanded 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -3654,12 +3858,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 0 + + trusted app 0 +
@@ -3674,7 +3880,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -3773,12 +3987,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 1 + + trusted app 1 +
@@ -3793,7 +4009,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -3892,12 +4116,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 2 + + trusted app 2 +
@@ -3912,7 +4138,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -4011,12 +4245,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 3 + + trusted app 3 +
@@ -4031,7 +4267,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -4130,12 +4374,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 4 + + trusted app 4 +
@@ -4150,7 +4396,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -4249,12 +4503,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 5 + + trusted app 5 +
@@ -4269,7 +4525,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -4368,12 +4632,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 6 + + trusted app 6 +
@@ -4388,7 +4654,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -4487,12 +4761,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 7 + + trusted app 7 +
@@ -4507,7 +4783,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -4606,12 +4890,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 8 + + trusted app 8 +
@@ -4626,7 +4912,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -4725,12 +5019,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 9 + + trusted app 9 +
@@ -4745,7 +5041,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -4844,12 +5148,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 10 + + trusted app 10 +
@@ -4864,7 +5170,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -4963,12 +5277,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 11 + + trusted app 11 +
@@ -4983,7 +5299,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -5082,12 +5406,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 12 + + trusted app 12 +
@@ -5102,7 +5428,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -5201,12 +5535,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 13 + + trusted app 13 +
@@ -5221,7 +5557,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -5320,12 +5664,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 14 + + trusted app 14 +
@@ -5340,7 +5686,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -5439,12 +5793,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 15 + + trusted app 15 +
@@ -5459,7 +5815,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -5558,12 +5922,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 16 + + trusted app 16 +
@@ -5578,7 +5944,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -5677,12 +6051,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 17 + + trusted app 17 +
@@ -5697,7 +6073,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Linux + + + Linux + +
- someone + + someone +
@@ -5796,12 +6180,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 18 + + trusted app 18 +
@@ -5816,7 +6202,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Windows + + + Windows + +
- someone + + someone +
@@ -5915,12 +6309,14 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = ` Name
- trusted app 19 + + trusted app 19 +
@@ -5935,7 +6331,13 @@ exports[`TrustedAppsList renders correctly when loaded data 1`] = `
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -6552,12 +6956,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 0 + + trusted app 0 +
@@ -6572,7 +6978,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -6671,12 +7085,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 1 + + trusted app 1 +
@@ -6691,7 +7107,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -6790,12 +7214,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 2 + + trusted app 2 +
@@ -6810,7 +7236,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Linux + + + Linux + +
- someone + + someone +
@@ -6909,12 +7343,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 3 + + trusted app 3 +
@@ -6929,7 +7365,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -7028,12 +7472,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 4 + + trusted app 4 +
@@ -7048,7 +7494,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -7147,12 +7601,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 5 + + trusted app 5 +
@@ -7167,7 +7623,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Linux + + + Linux + +
- someone + + someone +
@@ -7266,12 +7730,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 6 + + trusted app 6 +
@@ -7286,7 +7752,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -7385,12 +7859,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 7 + + trusted app 7 +
@@ -7405,7 +7881,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -7504,12 +7988,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 8 + + trusted app 8 +
@@ -7524,7 +8010,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Linux + + + Linux + +
- someone + + someone +
@@ -7623,12 +8117,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 9 + + trusted app 9 +
@@ -7643,7 +8139,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -7742,12 +8246,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 10 + + trusted app 10 +
@@ -7762,7 +8268,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -7861,12 +8375,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 11 + + trusted app 11 +
@@ -7881,7 +8397,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Linux + + + Linux + +
- someone + + someone +
@@ -7980,12 +8504,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 12 + + trusted app 12 +
@@ -8000,7 +8526,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -8099,12 +8633,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 13 + + trusted app 13 +
@@ -8119,7 +8655,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -8218,12 +8762,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 14 + + trusted app 14 +
@@ -8238,7 +8784,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Linux + + + Linux + +
- someone + + someone +
@@ -8337,12 +8891,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 15 + + trusted app 15 +
@@ -8357,7 +8913,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -8456,12 +9020,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 16 + + trusted app 16 +
@@ -8476,7 +9042,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -8575,12 +9149,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 17 + + trusted app 17 +
@@ -8595,7 +9171,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Linux + + + Linux + +
- someone + + someone +
@@ -8694,12 +9278,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 18 + + trusted app 18 +
@@ -8714,7 +9300,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Windows + + + Windows + +
- someone + + someone +
@@ -8813,12 +9407,14 @@ exports[`TrustedAppsList renders correctly when loading data for the second time Name
- trusted app 19 + + trusted app 19 +
@@ -8833,7 +9429,13 @@ exports[`TrustedAppsList renders correctly when loading data for the second time
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -9292,12 +9896,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 0 + + trusted app 0 +
@@ -9312,7 +9918,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -9411,12 +10025,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 1 + + trusted app 1 +
@@ -9431,7 +10047,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -9530,12 +10154,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 2 + + trusted app 2 +
@@ -9550,7 +10176,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Linux + + + Linux + +
- someone + + someone +
@@ -9649,12 +10283,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 3 + + trusted app 3 +
@@ -9669,7 +10305,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -9768,12 +10412,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 4 + + trusted app 4 +
@@ -9788,7 +10434,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -9887,12 +10541,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 5 + + trusted app 5 +
@@ -9907,7 +10563,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Linux + + + Linux + +
- someone + + someone +
@@ -10006,12 +10670,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 6 + + trusted app 6 +
@@ -10026,7 +10692,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -10125,12 +10799,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 7 + + trusted app 7 +
@@ -10145,7 +10821,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -10244,12 +10928,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 8 + + trusted app 8 +
@@ -10264,7 +10950,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Linux + + + Linux + +
- someone + + someone +
@@ -10363,12 +11057,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 9 + + trusted app 9 +
@@ -10383,7 +11079,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -10482,12 +11186,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 10 + + trusted app 10 +
@@ -10502,7 +11208,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -10601,12 +11315,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 11 + + trusted app 11 +
@@ -10621,7 +11337,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Linux + + + Linux + +
- someone + + someone +
@@ -10720,12 +11444,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 12 + + trusted app 12 +
@@ -10740,7 +11466,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -10839,12 +11573,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 13 + + trusted app 13 +
@@ -10859,7 +11595,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -10958,12 +11702,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 14 + + trusted app 14 +
@@ -10978,7 +11724,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Linux + + + Linux + +
- someone + + someone +
@@ -11077,12 +11831,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 15 + + trusted app 15 +
@@ -11097,7 +11853,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -11196,12 +11960,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 16 + + trusted app 16 +
@@ -11216,7 +11982,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
@@ -11315,12 +12089,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 17 + + trusted app 17 +
@@ -11335,7 +12111,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Linux + + + Linux + +
- someone + + someone +
@@ -11434,12 +12218,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 18 + + trusted app 18 +
@@ -11454,7 +12240,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Windows + + + Windows + +
- someone + + someone +
@@ -11553,12 +12347,14 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not Name
- trusted app 19 + + trusted app 19 +
@@ -11573,7 +12369,13 @@ exports[`TrustedAppsList renders correctly when new page and page size set (not
- Mac OS + + + Mac OS + +
- someone + + someone +
diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.tsx index d5c829bccb903..977db9e1fff2d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_list/index.tsx @@ -27,6 +27,7 @@ import { } from '../../../store/selectors'; import { FormattedDate } from '../../../../../../common/components/formatted_date'; +import { TextFieldValue } from '../../../../../../common/components/text_field_value'; import { useTrustedAppsNavigateCallback, useTrustedAppsSelector } from '../../hooks'; @@ -96,13 +97,27 @@ const getColumnDefinitions = (context: TrustedAppsListContext): ColumnsList => { { field: 'name', name: PROPERTY_TITLES.name, - truncateText: true, + render(value: TrustedApp['name'], record: Immutable) { + return ( + + ); + }, }, { field: 'os', name: PROPERTY_TITLES.os, render(value: TrustedApp['os'], record: Immutable) { - return OS_TITLES[value]; + return ( + + ); }, }, { @@ -121,6 +136,15 @@ const getColumnDefinitions = (context: TrustedAppsListContext): ColumnsList => { { field: 'created_by', name: PROPERTY_TITLES.created_by, + render(value: TrustedApp['created_by'], record: Immutable) { + return ( + + ); + }, }, { name: ACTIONS_COLUMN_TITLE, diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts index b442704169d06..b2f62c2f1da4e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/translations.ts @@ -28,7 +28,9 @@ export const OS_TITLES: Readonly<{ [K in TrustedApp['os']]: string }> = { }), }; -export const CONDITION_FIELD_TITLE: { [K in MacosLinuxConditionEntry['field']]: string } = { +type Entry = MacosLinuxConditionEntry | WindowsConditionEntry; + +export const CONDITION_FIELD_TITLE: { [K in Entry['field']]: string } = { 'process.hash.*': i18n.translate( 'xpack.securitySolution.trustedapps.logicalConditionBuilder.entry.field.hash', { defaultMessage: 'Hash' } @@ -37,6 +39,16 @@ export const CONDITION_FIELD_TITLE: { [K in MacosLinuxConditionEntry['field']]: 'xpack.securitySolution.trustedapps.logicalConditionBuilder.entry.field.path', { defaultMessage: 'Path' } ), + 'process.code_signature': i18n.translate( + 'xpack.securitySolution.trustedapps.logicalConditionBuilder.entry.field.signature', + { defaultMessage: 'Signature' } + ), +}; + +export const OPERATOR_TITLE: { [K in Entry['operator']]: string } = { + included: i18n.translate('xpack.securitySolution.trustedapps.card.operator.includes', { + defaultMessage: 'is', + }), }; export const PROPERTY_TITLES: Readonly< From bc1de5b5b9679ccfd80e6298f1fc4718360dbc00 Mon Sep 17 00:00:00 2001 From: Bohdan Tsymbala Date: Tue, 13 Oct 2020 14:21:20 +0200 Subject: [PATCH 29/85] Grid layout fixes (#80305) * fixes to make grid layout a bit more solid. * Changed the spacing a bit more. * Updated snapshot. --- .../__snapshots__/index.test.tsx.snap | 64 +++++++++++++++---- .../trusted_apps_grid/index.stories.tsx | 5 ++ .../components/trusted_apps_grid/index.tsx | 49 +++++++++----- 3 files changed, 90 insertions(+), 28 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/__snapshots__/index.test.tsx.snap index c7f5106fce5be..dc549a5b4f2d2 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/__snapshots__/index.test.tsx.snap @@ -3,19 +3,25 @@ exports[`TrustedAppsGrid renders correctly initially 1`] = `
+
No items found
+
@@ -25,7 +31,7 @@ exports[`TrustedAppsGrid renders correctly initially 1`] = ` exports[`TrustedAppsGrid renders correctly when failed loading data for the first time 1`] = `
+
Intenal Server Error +
@@ -48,7 +60,7 @@ exports[`TrustedAppsGrid renders correctly when failed loading data for the firs exports[`TrustedAppsGrid renders correctly when failed loading data for the second time 1`] = `
+
Intenal Server Error +
@@ -88,11 +106,14 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = `
+
@@ -2741,6 +2762,9 @@ exports[`TrustedAppsGrid renders correctly when loaded data 1`] = `
+
+
No items found
+
@@ -2999,7 +3029,7 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time
+
@@ -5659,6 +5692,9 @@ exports[`TrustedAppsGrid renders correctly when loading data for the second time
+
+
@@ -8541,6 +8580,9 @@ exports[`TrustedAppsGrid renders correctly when new page and page size set (not
+
) => 'MMM D, YYYY @ HH:mm:ss.SSS' } }}> ({ eui: euiLightVars, darkMode: false })}> + + + + diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.tsx index 4664727dd848c..d6827ba24c238 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/trusted_apps_grid/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { memo, useCallback, useEffect } from 'react'; +import React, { FC, memo, useCallback, useEffect } from 'react'; import { EuiTablePagination, EuiFlexGroup, @@ -12,6 +12,7 @@ import { EuiProgress, EuiIcon, EuiText, + EuiSpacer, } from '@elastic/eui'; import { Pagination } from '../../../state'; @@ -64,6 +65,14 @@ const PaginationBar = ({ pagination, onChange }: PaginationBarProps) => { ); }; +const GridMessage: FC = ({ children }) => ( +
+ + {children} + +
+); + export const TrustedAppsGrid = memo(() => { const pagination = useTrustedAppsSelector(getListPagination); const listItems = useTrustedAppsSelector(getListItems); @@ -80,7 +89,7 @@ export const TrustedAppsGrid = memo(() => { })); return ( - + {isLoading && ( @@ -88,27 +97,33 @@ export const TrustedAppsGrid = memo(() => { )} {error && ( -
+ {error} -
+ + )} + {!error && listItems.length === 0 && ( + + {NO_RESULTS_MESSAGE} + )} - {!error && ( - - {listItems.map((item) => ( - - - - ))} - {listItems.length === 0 && ( - - {NO_RESULTS_MESSAGE} - - )} - + {!error && listItems.length > 0 && ( + <> + + + + {listItems.map((item) => ( + + + + ))} + + )}
{!error && pagination.totalItemCount > 0 && ( + + )} From c36a27683c9ac04c433f95b07745489c0c66ef02 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Tue, 13 Oct 2020 08:24:45 -0400 Subject: [PATCH 30/85] [Ingest Manager] Fix agent policy bump revision to create only one POLICY_CHANGE action (#80081) --- .../server/services/agent_policy.test.ts | 36 +++++++++++++++++++ .../server/services/agent_policy.ts | 2 -- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/services/agent_policy.test.ts b/x-pack/plugins/ingest_manager/server/services/agent_policy.test.ts index d247b35c089e5..f9a8b63bb83ad 100644 --- a/x-pack/plugins/ingest_manager/server/services/agent_policy.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/agent_policy.test.ts @@ -6,6 +6,7 @@ import { savedObjectsClientMock } from 'src/core/server/mocks'; import { agentPolicyService } from './agent_policy'; +import { agentPolicyUpdateEventHandler } from './agent_policy_update'; import { Output } from '../types'; function getSavedObjectMock(agentPolicyAttributes: any) { @@ -59,7 +60,42 @@ jest.mock('./output', () => { }; }); +jest.mock('./agent_policy_update'); + +function getAgentPolicyUpdateMock() { + return (agentPolicyUpdateEventHandler as unknown) as jest.Mock< + typeof agentPolicyUpdateEventHandler + >; +} + describe('agent policy', () => { + beforeEach(() => { + getAgentPolicyUpdateMock().mockClear(); + }); + describe('bumpRevision', () => { + it('should call agentPolicyUpdateEventHandler with updated event once', async () => { + const soClient = getSavedObjectMock({ + revision: 1, + monitoring_enabled: ['metrics'], + }); + await agentPolicyService.bumpRevision(soClient, 'agent-policy'); + + expect(agentPolicyUpdateEventHandler).toHaveBeenCalledTimes(1); + }); + }); + + describe('bumpAllAgentPolicies', () => { + it('should call agentPolicyUpdateEventHandler with updated event once', async () => { + const soClient = getSavedObjectMock({ + revision: 1, + monitoring_enabled: ['metrics'], + }); + await agentPolicyService.bumpAllAgentPolicies(soClient); + + expect(agentPolicyUpdateEventHandler).toHaveBeenCalledTimes(1); + }); + }); + describe('getFullAgentPolicy', () => { it('should return a policy without monitoring if monitoring is not enabled', async () => { const soClient = getSavedObjectMock({ diff --git a/x-pack/plugins/ingest_manager/server/services/agent_policy.ts b/x-pack/plugins/ingest_manager/server/services/agent_policy.ts index f1dcc7e5d6c99..3a28286617111 100644 --- a/x-pack/plugins/ingest_manager/server/services/agent_policy.ts +++ b/x-pack/plugins/ingest_manager/server/services/agent_policy.ts @@ -297,8 +297,6 @@ class AgentPolicyService { ): Promise { const res = await this._update(soClient, id, {}, options?.user); - await this.triggerAgentPolicyUpdatedEvent(soClient, 'updated', id); - return res; } public async bumpAllAgentPolicies( From 3e0baff07052356c33f1a29233a7573243f86e1f Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 13 Oct 2020 08:30:04 -0400 Subject: [PATCH 31/85] [SECURITY_SOLUTION][ENDPOINT] Fix label on Trusted App create name field (#80001) * Correct the Name field label on the Trusted Apps Create form to say "Name your trusted application" (was "Name your trusted app application"). --- .../trusted_apps/view/components/create_trusted_app_form.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx index 8b922605e0ab4..b8692df0240fa 100644 --- a/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/trusted_apps/view/components/create_trusted_app_form.tsx @@ -347,7 +347,7 @@ export const CreateTrustedAppForm = memo( Date: Tue, 13 Oct 2020 09:00:31 -0400 Subject: [PATCH 32/85] [Ingest Manager] Split up OpenAPI spec file (#80107) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary replaces https://github.com/elastic/kibana/pull/77378 fixes https://github.com/elastic/kibana/issues/77290 * Replace the 4000+ line `spec_oas3.json` file with one ~75 line overview file `entrypoint.yaml` which imports the various pieces from other directories. * Switched from JSON to YAML for "source" files because they're less noisy & more human-friendly. `package-registry` & `package-spec` both define specs in YAML as well. We can always convert them to JS for any library that needs it. ## Dev docs ### New structure ``` openapi/ ├── README.md ├── bundled.json ├── bundled.yaml ├── components/ ├── entrypoint.yaml └── paths/ ``` There are `README.md` files in `openapi`, `openapi/components`, & `openapi/paths` with information about the purpose, conventions, decisions, etc for that directory * `entrypoint.yaml` is the overview file which links to the various files on disk. * `bundled.{yaml,json}` is the resolved output of that entry & other files in a single file.
how these were generated (requires node 12+) ``` nvm use 12; npx @redocly/openapi-cli bundle entrypoint.yaml -o bundled.json npx @redocly/openapi-cli bundle entrypoint.yaml -o bundled.yaml ```
How to generate with node 10+ ``` npx swagger-cli bundle -o bundled.json -t json entrypoint.yaml npx swagger-cli bundle -o bundled.yaml -t yaml entrypoint.yaml ```
* [Paths](paths/README.md): Started with a flat `paths` directory with each path in a separate file. We can move on to a nested file-per-operation like https://github.com/elastic/kibana/pull/77378 or any other approach later
tree ./paths ``` paths/ ├── README.md ├── agent_policies.yaml ├── agent_policies@delete.yaml ├── agent_policies@{agent_policy_id}.yaml ├── agent_policies@{agent_policy_id}@copy.yaml ├── agent_status.yaml ├── agents.yaml ├── agents@bulk_upgrade.yaml ├── agents@enroll.yaml ├── agents@setup.yaml ├── agents@{agent_id}.yaml ├── agents@{agent_id}@acks.yaml ├── agents@{agent_id}@checkin.yaml ├── agents@{agent_id}@events.yaml ├── agents@{agent_id}@unenroll.yaml ├── agents@{agent_id}@upgrade.yaml ├── enrollment_api_keys.yaml ├── enrollment_api_keys@{key_id}.yaml ├── epm@categories.yaml ├── epm@packages.yaml ├── epm@packages@{pkgkey}.yaml ├── install@{os_type}.yaml ├── package_policies.yaml ├── package_policies@{package_policy_id}.yaml └── setup.yaml ```
* [Components](components/README.md): Reusable components like [`schemas`](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject), [`responses`](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject) [`parameters`](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject), etc
tree ./components ``` components/ ├── README.md ├── callbacks ├── examples ├── headers │   └── kbn_xsrf.yaml ├── links ├── parameters │   ├── kuery.yaml │   ├── page_index.yaml │   └── page_size.yaml ├── request_bodies ├── responses ├── schemas │   ├── access_api_key.yaml │   ├── agent.yaml │   ├── agent_event.yaml │   ├── agent_metadata.yaml │   ├── agent_policy.yaml │   ├── agent_status.yaml │   ├── agent_type.yaml │   ├── bulk_upgrade_agents.yaml │   ├── enrollment_api_key.yaml │   ├── new_agent_event.yaml │   ├── new_agent_policy.yaml │   ├── new_package_policy.yaml │   ├── package_info.yaml │   ├── package_policy.yaml │   ├── search_result.yaml │   └── upgrade_agent.yaml └── security_schemes ```
--- .../ingest_manager/common/openapi/README.md | 14 + .../common/openapi/bundled.json | 2088 ++++++++ .../common/openapi/bundled.yaml | 1327 +++++ .../common/openapi/components/README.md | 13 + .../openapi/components/headers/kbn_xsrf.yaml | 5 + .../openapi/components/parameters/kuery.yaml | 5 + .../components/parameters/page_index.yaml | 6 + .../components/parameters/page_size.yaml | 7 + .../components/schemas/access_api_key.yaml | 3 + .../openapi/components/schemas/agent.yaml | 48 + .../components/schemas/agent_event.yaml | 9 + .../components/schemas/agent_metadata.yaml | 2 + .../components/schemas/agent_policy.yaml | 30 + .../components/schemas/agent_status.yaml | 8 + .../components/schemas/agent_type.yaml | 6 + .../schemas/bulk_upgrade_agents.yaml | 37 + .../schemas/enrollment_api_key.yaml | 3 + .../components/schemas/new_agent_event.yaml | 44 + .../components/schemas/new_agent_policy.yaml | 9 + .../schemas/new_package_policy.yaml | 58 + .../components/schemas/package_info.yaml | 118 + .../components/schemas/package_policy.yaml | 15 + .../components/schemas/search_result.yaml | 33 + .../components/schemas/upgrade_agent.yaml | 16 + .../common/openapi/entrypoint.yaml | 77 + .../common/openapi/paths/README.md | 130 + .../common/openapi/paths/agent_policies.yaml | 54 + .../openapi/paths/agent_policies@delete.yaml | 33 + .../agent_policies@{agent_policy_id}.yaml | 47 + ...agent_policies@{agent_policy_id}@copy.yaml | 35 + .../common/openapi/paths/agent_status.yaml | 11 + .../common/openapi/paths/agents.yaml | 29 + .../openapi/paths/agents@bulk_upgrade.yaml | 25 + .../common/openapi/paths/agents@enroll.yaml | 47 + .../common/openapi/paths/agents@setup.yaml | 48 + .../openapi/paths/agents@{agent_id}.yaml | 36 + .../openapi/paths/agents@{agent_id}@acks.yaml | 32 + .../paths/agents@{agent_id}@checkin.yaml | 60 + .../paths/agents@{agent_id}@events.yaml | 11 + .../paths/agents@{agent_id}@unenroll.yaml | 21 + .../paths/agents@{agent_id}@upgrade.yaml | 32 + .../openapi/paths/enrollment_api_keys.yaml | 13 + .../paths/enrollment_api_keys@{key_id}.yaml | 18 + .../common/openapi/paths/epm@categories.yaml | 24 + .../common/openapi/paths/epm@packages.yaml | 14 + .../openapi/paths/epm@packages@{pkgkey}.yaml | 91 + .../openapi/paths/install@{os_type}.yaml | 11 + .../openapi/paths/package_policies.yaml | 40 + .../package_policies@{package_policy_id}.yaml | 42 + .../common/openapi/paths/setup.yaml | 25 + .../common/openapi/spec_oas3.json | 4538 ----------------- 51 files changed, 4910 insertions(+), 4538 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/common/openapi/README.md create mode 100644 x-pack/plugins/ingest_manager/common/openapi/bundled.json create mode 100644 x-pack/plugins/ingest_manager/common/openapi/bundled.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/README.md create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/headers/kbn_xsrf.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/parameters/kuery.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_index.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_size.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/access_api_key.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_event.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_metadata.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_policy.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_status.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_type.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/bulk_upgrade_agents.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/enrollment_api_key.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_event.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_policy.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_package_policy.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_info.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_policy.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/search_result.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/components/schemas/upgrade_agent.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/entrypoint.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/README.md create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@delete.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}@copy.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agent_status.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@bulk_upgrade.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@enroll.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@setup.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@acks.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@checkin.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@events.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@unenroll.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@upgrade.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys@{key_id}.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/epm@categories.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages@{pkgkey}.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/install@{os_type}.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/package_policies.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/package_policies@{package_policy_id}.yaml create mode 100644 x-pack/plugins/ingest_manager/common/openapi/paths/setup.yaml delete mode 100644 x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json diff --git a/x-pack/plugins/ingest_manager/common/openapi/README.md b/x-pack/plugins/ingest_manager/common/openapi/README.md new file mode 100644 index 0000000000000..72204d483b120 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/README.md @@ -0,0 +1,14 @@ +## The `openapi` folder + +* `entrypoint.yaml` is the overview file which links to the various files on disk. +* `bundled.{yaml,json}` is the resolved output of that entry & other files in a single file. It's currently generated with: + + ``` + npx swagger-cli bundle -o bundled.json -t json entrypoint.yaml + npx swagger-cli bundle -o bundled.yaml -t yaml entrypoint.yaml + ``` +* [Paths](paths/README.md): this defines each endpoint. A path can have one operation per http method. +* [Components](components/README.md): Reusable components like [`schemas`](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject), + [`responses`](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject) + [`parameters`](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject), etc + \ No newline at end of file diff --git a/x-pack/plugins/ingest_manager/common/openapi/bundled.json b/x-pack/plugins/ingest_manager/common/openapi/bundled.json new file mode 100644 index 0000000000000..1d00855de8935 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/bundled.json @@ -0,0 +1,2088 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Ingest Manager", + "version": "0.2", + "contact": { + "name": "Ingest Team" + }, + "license": { + "name": "Elastic" + } + }, + "servers": [ + { + "url": "http://localhost:5601/api/fleet", + "description": "local" + } + ], + "paths": { + "/agent_policies": { + "get": { + "summary": "Agent policy - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/agent_policy" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + } + }, + "required": [ + "items", + "total", + "page", + "perPage" + ] + } + } + } + } + }, + "operationId": "agent-policy-list", + "parameters": [ + { + "$ref": "#/components/parameters/page_size" + }, + { + "$ref": "#/components/parameters/page_index" + }, + { + "$ref": "#/components/parameters/kuery" + } + ], + "description": "" + }, + "post": { + "summary": "Agent policy - Create", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/agent_policy" + } + } + } + } + } + } + }, + "operationId": "post-agent-policy", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/new_agent_policy" + } + } + } + }, + "security": [], + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/agent_policies/{agentPolicyId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentPolicyId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Agent policy - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/agent_policy" + } + }, + "required": [ + "item" + ] + } + } + } + } + }, + "operationId": "agent-policy-info", + "description": "Get one agent policy", + "parameters": [] + }, + "put": { + "summary": "Agent policy - Update", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/agent_policy" + } + }, + "required": [ + "item" + ] + } + } + } + } + }, + "operationId": "put-agent-policy-agentPolicyId", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/new_agent_policy" + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/agent_policies/{agentPolicyId}/copy": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentPolicyId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Agent policy - copy one policy", + "operationId": "agent-policy-copy", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/agent_policy" + } + }, + "required": [ + "item" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "name" + ] + } + } + }, + "description": "" + }, + "description": "Copies one agent policy" + } + }, + "/agent_policies/delete": { + "post": { + "summary": "Agent policy - Delete", + "operationId": "post-agent-policy-delete", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "id", + "success" + ] + } + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "agentPolicyIds": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + }, + "parameters": [] + }, + "/agent-status": { + "get": { + "summary": "Fleet - Agent - Status for policy", + "tags": [], + "responses": {}, + "operationId": "get-fleet-agent-status", + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "policyId", + "in": "query", + "required": false + } + ] + } + }, + "/agents": { + "get": { + "summary": "Fleet - Agent - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "list": { + "type": "array", + "items": { + "type": "object" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + } + }, + "required": [ + "list", + "total", + "page", + "perPage" + ] + } + } + } + } + }, + "operationId": "get-fleet-agents", + "security": [ + { + "basicAuth": [] + } + ] + } + }, + "/agents/{agentId}/acks": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Acks", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "acks" + ] + } + }, + "required": [ + "action" + ] + } + } + } + } + }, + "operationId": "post-fleet-agents-agentId-acks", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + } + } + }, + "/agents/{agentId}/checkin": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Check In", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "checkin" + ] + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "agent_id": { + "type": "string" + }, + "data": { + "type": "object" + }, + "id": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "agent_id", + "data", + "id", + "created_at", + "type" + ] + } + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-agentId-checkin", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ], + "security": [ + { + "Access API Key": [] + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "local_metadata": { + "$ref": "#/components/schemas/agent_metadata" + }, + "events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/new_agent_event" + } + } + } + } + } + } + } + } + }, + "/agents/{agentId}/events": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Events", + "tags": [], + "responses": {}, + "operationId": "get-fleet-agents-agentId-events" + } + }, + "/agents/{agentId}/unenroll": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Unenroll", + "tags": [], + "responses": {}, + "operationId": "post-fleet-agents-unenroll", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "force": { + "type": "boolean" + } + } + } + } + } + } + } + }, + "/agents/{agentId}/upgrade": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Fleet - Agent - Upgrade", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/upgrade_agent" + } + } + } + }, + "400": { + "description": "BAD REQUEST", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/upgrade_agent" + } + } + } + } + }, + "operationId": "post-fleet-agents-upgrade", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/upgrade_agent" + } + } + } + } + } + }, + "/agents/bulk_upgrade": { + "post": { + "summary": "Fleet - Agent - Bulk Upgrade", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/bulk_upgrade_agents" + } + } + } + }, + "400": { + "description": "BAD REQUEST", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/upgrade_agent" + } + } + } + } + }, + "operationId": "post-fleet-agents-bulk-upgrade", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/bulk_upgrade_agents" + } + } + } + } + } + }, + "/agents/enroll": { + "post": { + "summary": "Fleet - Agent - Enroll", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "item": { + "$ref": "#/components/schemas/agent" + } + } + } + } + } + } + }, + "operationId": "post-fleet-agents-enroll", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "PERMANENT", + "EPHEMERAL", + "TEMPORARY" + ] + }, + "shared_id": { + "type": "string" + }, + "metadata": { + "type": "object", + "required": [ + "local", + "user_provided" + ], + "properties": { + "local": { + "$ref": "#/components/schemas/agent_metadata" + }, + "user_provided": { + "$ref": "#/components/schemas/agent_metadata" + } + } + } + }, + "required": [ + "type", + "metadata" + ] + } + } + } + }, + "security": [ + { + "Enrollment API Key": [] + } + ] + } + }, + "/agents/setup": { + "get": { + "summary": "Agents setup - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + }, + "required": [ + "isInitialized" + ] + } + } + } + } + }, + "operationId": "get-agents-setup", + "security": [ + { + "basicAuth": [] + } + ] + }, + "post": { + "summary": "Agents setup - Create", + "operationId": "post-agents-setup", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + }, + "required": [ + "isInitialized" + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "admin_username": { + "type": "string" + }, + "admin_password": { + "type": "string" + } + }, + "required": [ + "admin_username", + "admin_password" + ] + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/enrollment-api-keys": { + "get": { + "summary": "Enrollment - List", + "tags": [], + "responses": {}, + "operationId": "get-fleet-enrollment-api-keys", + "parameters": [] + }, + "post": { + "summary": "Enrollment - Create", + "tags": [], + "responses": {}, + "operationId": "post-fleet-enrollment-api-keys", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/enrollment-api-keys/{keyId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "keyId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Enrollment - Info", + "tags": [], + "responses": {}, + "operationId": "get-fleet-enrollment-api-keys-keyId" + }, + "delete": { + "summary": "Enrollment - Delete", + "tags": [], + "responses": {}, + "operationId": "delete-fleet-enrollment-api-keys-keyId", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/epm/categories": { + "get": { + "summary": "EPM - Categories", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + }, + "count": { + "type": "number" + } + }, + "required": [ + "id", + "title", + "count" + ] + } + } + } + } + } + }, + "operationId": "get-epm-categories" + } + }, + "/epm/packages": { + "get": { + "summary": "EPM - Packages - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/search_result" + } + } + } + } + } + }, + "operationId": "get-epm-list" + }, + "parameters": [] + }, + "/epm/packages/{pkgkey}": { + "get": { + "summary": "EPM - Packages - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "properties": { + "response": { + "$ref": "#/components/schemas/package_info" + } + } + }, + { + "properties": { + "status": { + "type": "string", + "enum": [ + "installed", + "not_installed" + ] + }, + "savedObject": { + "type": "string" + } + }, + "required": [ + "status", + "savedObject" + ] + } + ] + } + } + } + } + }, + "operationId": "get-epm-package-pkgkey", + "security": [ + { + "basicAuth": [] + } + ] + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "pkgkey", + "in": "path", + "required": true + } + ], + "post": { + "summary": "EPM - Packages - Install", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ] + } + } + }, + "required": [ + "response" + ] + } + } + } + } + }, + "operationId": "post-epm-install-pkgkey", + "description": "", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + }, + "delete": { + "summary": "EPM - Packages - Delete", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "response": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ] + } + } + }, + "required": [ + "response" + ] + } + } + } + } + }, + "operationId": "post-epm-delete-pkgkey", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/agents/{agentId}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "agentId", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Agent - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "type": "object" + } + }, + "required": [ + "item" + ] + } + } + } + } + }, + "operationId": "get-fleet-agents-agentId" + }, + "put": { + "summary": "Fleet - Agent - Update", + "tags": [], + "responses": {}, + "operationId": "put-fleet-agents-agentId", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + }, + "delete": { + "summary": "Fleet - Agent - Delete", + "tags": [], + "responses": {}, + "operationId": "delete-fleet-agents-agentId", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/install/{osType}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "osType", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Fleet - Get OS install script", + "tags": [], + "responses": {}, + "operationId": "get-fleet-install-osType" + } + }, + "/package_policies": { + "get": { + "summary": "PackagePolicies - List", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/package_policy" + } + }, + "total": { + "type": "number" + }, + "page": { + "type": "number" + }, + "perPage": { + "type": "number" + } + }, + "required": [ + "items" + ] + } + } + } + } + }, + "operationId": "get-packagePolicies", + "security": [], + "parameters": [] + }, + "parameters": [], + "post": { + "summary": "PackagePolicies - Create", + "operationId": "post-packagePolicies", + "responses": { + "200": { + "description": "OK" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/new_package_policy" + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/package_policies/{packagePolicyId}": { + "get": { + "summary": "PackagePolicies - Info", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/package_policy" + } + }, + "required": [ + "item" + ] + } + } + } + } + }, + "operationId": "get-packagePolicies-packagePolicyId" + }, + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "packagePolicyId", + "in": "path", + "required": true + } + ], + "put": { + "summary": "PackagePolicies - Update", + "operationId": "put-packagePolicies-packagePolicyId", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "item": { + "$ref": "#/components/schemas/package_policy" + }, + "sucess": { + "type": "boolean" + } + }, + "required": [ + "item", + "sucess" + ] + } + } + } + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + }, + "/setup": { + "post": { + "summary": "Ingest Manager - Setup", + "tags": [], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "isInitialized": { + "type": "boolean" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + } + } + } + } + } + }, + "operationId": "post-setup", + "parameters": [ + { + "$ref": "#/components/parameters/kbn_xsrf" + } + ] + } + } + }, + "components": { + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "Enrollment API Key": { + "name": "Authorization", + "type": "apiKey", + "in": "header", + "description": "e.g. Authorization: ApiKey base64EnrollmentApiKey" + }, + "Access API Key": { + "name": "Authorization", + "type": "apiKey", + "in": "header", + "description": "e.g. Authorization: ApiKey base64AccessApiKey" + } + }, + "parameters": { + "page_size": { + "name": "perPage", + "in": "query", + "description": "The number of items to return", + "required": false, + "schema": { + "type": "integer", + "default": 50 + } + }, + "page_index": { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "default": 1 + } + }, + "kuery": { + "name": "kuery", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + "kbn_xsrf": { + "schema": { + "type": "string" + }, + "in": "header", + "name": "kbn-xsrf", + "required": true + } + }, + "schemas": { + "new_agent_policy": { + "title": "NewAgentPolicy", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "description": { + "type": "string" + } + } + }, + "new_package_policy": { + "title": "NewPackagePolicy", + "type": "object", + "description": "", + "properties": { + "enabled": { + "type": "boolean" + }, + "package": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "name", + "version", + "title" + ] + }, + "namespace": { + "type": "string" + }, + "output_id": { + "type": "string" + }, + "inputs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "array", + "items": { + "type": "string" + } + }, + "streams": { + "type": "array", + "items": {} + }, + "config": { + "type": "object" + }, + "vars": { + "type": "object" + } + }, + "required": [ + "type", + "enabled", + "streams" + ] + } + }, + "policy_id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "output_id", + "inputs", + "policy_id", + "name" + ] + }, + "package_policy": { + "title": "PackagePolicy", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "inputs": { + "type": "array", + "items": {} + } + }, + "required": [ + "id", + "revision" + ] + }, + { + "$ref": "#/components/schemas/new_package_policy" + } + ] + }, + "agent_policy": { + "allOf": [ + { + "$ref": "#/components/schemas/new_agent_policy" + }, + { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "inactive" + ] + }, + "packagePolicies": { + "oneOf": [ + { + "items": { + "type": "string" + } + }, + { + "items": { + "$ref": "#/components/schemas/package_policy" + } + } + ], + "type": "array" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "updated_by": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "agents": { + "type": "number" + } + }, + "required": [ + "id", + "status" + ] + } + ] + }, + "agent_metadata": { + "title": "AgentMetadata", + "type": "object" + }, + "new_agent_event": { + "title": "NewAgentEvent", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "STATE", + "ERROR", + "ACTION_RESULT", + "ACTION" + ] + }, + "subtype": { + "type": "string", + "enum": [ + "RUNNING", + "STARTING", + "IN_PROGRESS", + "CONFIG", + "FAILED", + "STOPPING", + "STOPPED", + "DEGRADED", + "DATA_DUMP", + "ACKNOWLEDGED", + "UNKNOWN" + ] + }, + "timestamp": { + "type": "string" + }, + "message": { + "type": "string" + }, + "payload": { + "type": "string" + }, + "agent_id": { + "type": "string" + }, + "policy_id": { + "type": "string" + }, + "stream_id": { + "type": "string" + }, + "action_id": { + "type": "string" + } + }, + "required": [ + "type", + "subtype", + "timestamp", + "message", + "agent_id" + ] + }, + "upgrade_agent": { + "title": "UpgradeAgent", + "oneOf": [ + { + "type": "object", + "properties": { + "version": { + "type": "string" + } + }, + "required": [ + "version" + ] + }, + { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "source_uri": { + "type": "string" + } + }, + "required": [ + "version" + ] + } + ] + }, + "bulk_upgrade_agents": { + "title": "BulkUpgradeAgents", + "oneOf": [ + { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "agents": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "version", + "agents" + ] + }, + { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "source_uri": { + "type": "string" + }, + "agents": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "version", + "agents" + ] + }, + { + "type": "object", + "properties": { + "version": { + "type": "string" + }, + "source_uri": { + "type": "string" + }, + "agents": { + "type": "string" + } + }, + "required": [ + "version", + "agents" + ] + } + ] + }, + "agent_type": { + "type": "string", + "title": "AgentType", + "enum": [ + "PERMANENT", + "EPHEMERAL", + "TEMPORARY" + ] + }, + "agent_event": { + "title": "AgentEvent", + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ] + }, + { + "$ref": "#/components/schemas/new_agent_event" + } + ] + }, + "agent_status": { + "type": "string", + "title": "AgentStatus", + "enum": [ + "offline", + "error", + "online", + "inactive", + "warning" + ] + }, + "agent": { + "title": "Agent", + "type": "object", + "properties": { + "type": { + "$ref": "#/components/schemas/agent_type" + }, + "active": { + "type": "boolean" + }, + "enrolled_at": { + "type": "string" + }, + "unenrolled_at": { + "type": "string" + }, + "unenrollment_started_at": { + "type": "string" + }, + "shared_id": { + "type": "string" + }, + "access_api_key_id": { + "type": "string" + }, + "default_api_key_id": { + "type": "string" + }, + "policy_id": { + "type": "string" + }, + "policy_revision": { + "type": "number" + }, + "last_checkin": { + "type": "string" + }, + "user_provided_metadata": { + "$ref": "#/components/schemas/agent_metadata" + }, + "local_metadata": { + "$ref": "#/components/schemas/agent_metadata" + }, + "id": { + "type": "string" + }, + "current_error_events": { + "type": "array", + "items": { + "$ref": "#/components/schemas/agent_event" + } + }, + "access_api_key": { + "type": "string" + }, + "status": { + "$ref": "#/components/schemas/agent_status" + }, + "default_api_key": { + "type": "string" + } + }, + "required": [ + "type", + "active", + "enrolled_at", + "id", + "current_error_events", + "status" + ] + }, + "search_result": { + "title": "SearchResult", + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "download": { + "type": "string" + }, + "icons": { + "type": "string" + }, + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + }, + "version": { + "type": "string" + }, + "status": { + "type": "string" + }, + "savedObject": { + "type": "object" + } + }, + "required": [ + "description", + "download", + "icons", + "name", + "path", + "title", + "type", + "version", + "status" + ] + }, + "package_info": { + "title": "PackageInfo", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "title": { + "type": "string" + }, + "version": { + "type": "string" + }, + "readme": { + "type": "string" + }, + "description": { + "type": "string" + }, + "type": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "requirement": { + "oneOf": [ + { + "properties": { + "kibana": { + "type": "object", + "properties": { + "versions": { + "type": "string" + } + } + } + } + }, + { + "properties": { + "elasticsearch": { + "type": "object", + "properties": { + "versions": { + "type": "string" + } + } + } + } + } + ], + "type": "object" + }, + "screenshots": { + "type": "array", + "items": { + "type": "object", + "properties": { + "src": { + "type": "string" + }, + "path": { + "type": "string" + }, + "title": { + "type": "string" + }, + "size": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "src", + "path" + ] + } + }, + "icons": { + "type": "array", + "items": { + "type": "string" + } + }, + "assets": { + "type": "array", + "items": { + "type": "string" + } + }, + "internal": { + "type": "boolean" + }, + "format_version": { + "type": "string" + }, + "data_streams": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "name": { + "type": "string" + }, + "release": { + "type": "string" + }, + "ingeset_pipeline": { + "type": "string" + }, + "vars": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "default": { + "type": "string" + } + }, + "required": [ + "name", + "default" + ] + } + }, + "type": { + "type": "string" + }, + "package": { + "type": "string" + } + }, + "required": [ + "title", + "name", + "release", + "ingeset_pipeline", + "type", + "package" + ] + } + }, + "download": { + "type": "string" + }, + "path": { + "type": "string" + }, + "removable": { + "type": "boolean" + } + }, + "required": [ + "name", + "title", + "version", + "description", + "type", + "categories", + "requirement", + "assets", + "format_version", + "download", + "path" + ] + } + } + }, + "security": [ + { + "basicAuth": [] + } + ] +} \ No newline at end of file diff --git a/x-pack/plugins/ingest_manager/common/openapi/bundled.yaml b/x-pack/plugins/ingest_manager/common/openapi/bundled.yaml new file mode 100644 index 0000000000000..9ab85ab2b8232 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/bundled.yaml @@ -0,0 +1,1327 @@ +openapi: 3.0.0 +info: + title: Ingest Manager + version: '0.2' + contact: + name: Ingest Team + license: + name: Elastic +servers: + - url: 'http://localhost:5601/api/fleet' + description: local +paths: + /agent_policies: + get: + summary: Agent policy - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/agent_policy' + total: + type: number + page: + type: number + perPage: + type: number + required: + - items + - total + - page + - perPage + operationId: agent-policy-list + parameters: + - $ref: '#/components/parameters/page_size' + - $ref: '#/components/parameters/page_index' + - $ref: '#/components/parameters/kuery' + description: '' + post: + summary: Agent policy - Create + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/agent_policy' + operationId: post-agent-policy + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/new_agent_policy' + security: [] + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + '/agent_policies/{agentPolicyId}': + parameters: + - schema: + type: string + name: agentPolicyId + in: path + required: true + get: + summary: Agent policy - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/agent_policy' + required: + - item + operationId: agent-policy-info + description: Get one agent policy + parameters: [] + put: + summary: Agent policy - Update + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/agent_policy' + required: + - item + operationId: put-agent-policy-agentPolicyId + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/new_agent_policy' + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + '/agent_policies/{agentPolicyId}/copy': + parameters: + - schema: + type: string + name: agentPolicyId + in: path + required: true + post: + summary: Agent policy - copy one policy + operationId: agent-policy-copy + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/agent_policy' + required: + - item + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: + type: string + required: + - name + description: '' + description: Copies one agent policy + /agent_policies/delete: + post: + summary: Agent policy - Delete + operationId: post-agent-policy-delete + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + success: + type: boolean + required: + - id + - success + requestBody: + content: + application/json: + schema: + type: object + properties: + agentPolicyIds: + type: array + items: + type: string + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + parameters: [] + /agent-status: + get: + summary: Fleet - Agent - Status for policy + tags: [] + responses: {} + operationId: get-fleet-agent-status + parameters: + - schema: + type: string + name: policyId + in: query + required: false + /agents: + get: + summary: Fleet - Agent - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + list: + type: array + items: + type: object + total: + type: number + page: + type: number + perPage: + type: number + required: + - list + - total + - page + - perPage + operationId: get-fleet-agents + security: + - basicAuth: [] + '/agents/{agentId}/acks': + parameters: + - schema: + type: string + name: agentId + in: path + required: true + post: + summary: Fleet - Agent - Acks + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + action: + type: string + enum: + - acks + required: + - action + operationId: post-fleet-agents-agentId-acks + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + requestBody: + content: + application/json: + schema: + type: object + properties: {} + '/agents/{agentId}/checkin': + parameters: + - schema: + type: string + name: agentId + in: path + required: true + post: + summary: Fleet - Agent - Check In + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + action: + type: string + enum: + - checkin + actions: + type: array + items: + type: object + properties: + agent_id: + type: string + data: + type: object + id: + type: string + created_at: + type: string + format: date-time + type: + type: string + required: + - agent_id + - data + - id + - created_at + - type + operationId: post-fleet-agents-agentId-checkin + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + security: + - Access API Key: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + local_metadata: + $ref: '#/components/schemas/agent_metadata' + events: + type: array + items: + $ref: '#/components/schemas/new_agent_event' + '/agents/{agentId}/events': + parameters: + - schema: + type: string + name: agentId + in: path + required: true + get: + summary: Fleet - Agent - Events + tags: [] + responses: {} + operationId: get-fleet-agents-agentId-events + '/agents/{agentId}/unenroll': + parameters: + - schema: + type: string + name: agentId + in: path + required: true + post: + summary: Fleet - Agent - Unenroll + tags: [] + responses: {} + operationId: post-fleet-agents-unenroll + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + requestBody: + content: + application/json: + schema: + type: object + properties: + force: + type: boolean + '/agents/{agentId}/upgrade': + parameters: + - schema: + type: string + name: agentId + in: path + required: true + post: + summary: Fleet - Agent - Upgrade + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/upgrade_agent' + '400': + description: BAD REQUEST + content: + application/json: + schema: + $ref: '#/components/schemas/upgrade_agent' + operationId: post-fleet-agents-upgrade + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/upgrade_agent' + /agents/bulk_upgrade: + post: + summary: Fleet - Agent - Bulk Upgrade + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/bulk_upgrade_agents' + '400': + description: BAD REQUEST + content: + application/json: + schema: + $ref: '#/components/schemas/upgrade_agent' + operationId: post-fleet-agents-bulk-upgrade + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/bulk_upgrade_agents' + /agents/enroll: + post: + summary: Fleet - Agent - Enroll + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + action: + type: string + item: + $ref: '#/components/schemas/agent' + operationId: post-fleet-agents-enroll + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + requestBody: + content: + application/json: + schema: + type: object + properties: + type: + type: string + enum: + - PERMANENT + - EPHEMERAL + - TEMPORARY + shared_id: + type: string + metadata: + type: object + required: + - local + - user_provided + properties: + local: + $ref: '#/components/schemas/agent_metadata' + user_provided: + $ref: '#/components/schemas/agent_metadata' + required: + - type + - metadata + security: + - Enrollment API Key: [] + /agents/setup: + get: + summary: Agents setup - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + isInitialized: + type: boolean + required: + - isInitialized + operationId: get-agents-setup + security: + - basicAuth: [] + post: + summary: Agents setup - Create + operationId: post-agents-setup + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + isInitialized: + type: boolean + required: + - isInitialized + requestBody: + content: + application/json: + schema: + type: object + properties: + admin_username: + type: string + admin_password: + type: string + required: + - admin_username + - admin_password + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + /enrollment-api-keys: + get: + summary: Enrollment - List + tags: [] + responses: {} + operationId: get-fleet-enrollment-api-keys + parameters: [] + post: + summary: Enrollment - Create + tags: [] + responses: {} + operationId: post-fleet-enrollment-api-keys + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + '/enrollment-api-keys/{keyId}': + parameters: + - schema: + type: string + name: keyId + in: path + required: true + get: + summary: Enrollment - Info + tags: [] + responses: {} + operationId: get-fleet-enrollment-api-keys-keyId + delete: + summary: Enrollment - Delete + tags: [] + responses: {} + operationId: delete-fleet-enrollment-api-keys-keyId + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + /epm/categories: + get: + summary: EPM - Categories + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + title: + type: string + count: + type: number + required: + - id + - title + - count + operationId: get-epm-categories + /epm/packages: + get: + summary: EPM - Packages - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/search_result' + operationId: get-epm-list + parameters: [] + '/epm/packages/{pkgkey}': + get: + summary: EPM - Packages - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + allOf: + - properties: + response: + $ref: '#/components/schemas/package_info' + - properties: + status: + type: string + enum: + - installed + - not_installed + savedObject: + type: string + required: + - status + - savedObject + operationId: get-epm-package-pkgkey + security: + - basicAuth: [] + parameters: + - schema: + type: string + name: pkgkey + in: path + required: true + post: + summary: EPM - Packages - Install + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + response: + type: array + items: + type: object + properties: + id: + type: string + type: + type: string + required: + - id + - type + required: + - response + operationId: post-epm-install-pkgkey + description: '' + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + delete: + summary: EPM - Packages - Delete + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + response: + type: array + items: + type: object + properties: + id: + type: string + type: + type: string + required: + - id + - type + required: + - response + operationId: post-epm-delete-pkgkey + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + '/agents/{agentId}': + parameters: + - schema: + type: string + name: agentId + in: path + required: true + get: + summary: Fleet - Agent - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + type: object + required: + - item + operationId: get-fleet-agents-agentId + put: + summary: Fleet - Agent - Update + tags: [] + responses: {} + operationId: put-fleet-agents-agentId + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + delete: + summary: Fleet - Agent - Delete + tags: [] + responses: {} + operationId: delete-fleet-agents-agentId + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + '/install/{osType}': + parameters: + - schema: + type: string + name: osType + in: path + required: true + get: + summary: Fleet - Get OS install script + tags: [] + responses: {} + operationId: get-fleet-install-osType + /package_policies: + get: + summary: PackagePolicies - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/package_policy' + total: + type: number + page: + type: number + perPage: + type: number + required: + - items + operationId: get-packagePolicies + security: [] + parameters: [] + parameters: [] + post: + summary: PackagePolicies - Create + operationId: post-packagePolicies + responses: + '200': + description: OK + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/new_package_policy' + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + '/package_policies/{packagePolicyId}': + get: + summary: PackagePolicies - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/package_policy' + required: + - item + operationId: get-packagePolicies-packagePolicyId + parameters: + - schema: + type: string + name: packagePolicyId + in: path + required: true + put: + summary: PackagePolicies - Update + operationId: put-packagePolicies-packagePolicyId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: '#/components/schemas/package_policy' + sucess: + type: boolean + required: + - item + - sucess + parameters: + - $ref: '#/components/parameters/kbn_xsrf' + /setup: + post: + summary: Ingest Manager - Setup + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + isInitialized: + type: boolean + '500': + description: Internal Server Error + content: + application/json: + schema: + type: object + properties: + message: + type: string + operationId: post-setup + parameters: + - $ref: '#/components/parameters/kbn_xsrf' +components: + securitySchemes: + basicAuth: + type: http + scheme: basic + Enrollment API Key: + name: Authorization + type: apiKey + in: header + description: 'e.g. Authorization: ApiKey base64EnrollmentApiKey' + Access API Key: + name: Authorization + type: apiKey + in: header + description: 'e.g. Authorization: ApiKey base64AccessApiKey' + parameters: + page_size: + name: perPage + in: query + description: The number of items to return + required: false + schema: + type: integer + default: 50 + page_index: + name: page + in: query + required: false + schema: + type: integer + default: 1 + kuery: + name: kuery + in: query + required: false + schema: + type: string + kbn_xsrf: + schema: + type: string + in: header + name: kbn-xsrf + required: true + schemas: + new_agent_policy: + title: NewAgentPolicy + type: object + properties: + name: + type: string + namespace: + type: string + description: + type: string + new_package_policy: + title: NewPackagePolicy + type: object + description: '' + properties: + enabled: + type: boolean + package: + type: object + properties: + name: + type: string + version: + type: string + title: + type: string + required: + - name + - version + - title + namespace: + type: string + output_id: + type: string + inputs: + type: array + items: + type: object + properties: + type: + type: string + enabled: + type: boolean + processors: + type: array + items: + type: string + streams: + type: array + items: {} + config: + type: object + vars: + type: object + required: + - type + - enabled + - streams + policy_id: + type: string + name: + type: string + description: + type: string + required: + - output_id + - inputs + - policy_id + - name + package_policy: + title: PackagePolicy + allOf: + - type: object + properties: + id: + type: string + revision: + type: number + inputs: + type: array + items: {} + required: + - id + - revision + - $ref: '#/components/schemas/new_package_policy' + agent_policy: + allOf: + - $ref: '#/components/schemas/new_agent_policy' + - type: object + properties: + id: + type: string + status: + type: string + enum: + - active + - inactive + packagePolicies: + oneOf: + - items: + type: string + - items: + $ref: '#/components/schemas/package_policy' + type: array + updated_on: + type: string + format: date-time + updated_by: + type: string + revision: + type: number + agents: + type: number + required: + - id + - status + agent_metadata: + title: AgentMetadata + type: object + new_agent_event: + title: NewAgentEvent + type: object + properties: + type: + type: string + enum: + - STATE + - ERROR + - ACTION_RESULT + - ACTION + subtype: + type: string + enum: + - RUNNING + - STARTING + - IN_PROGRESS + - CONFIG + - FAILED + - STOPPING + - STOPPED + - DEGRADED + - DATA_DUMP + - ACKNOWLEDGED + - UNKNOWN + timestamp: + type: string + message: + type: string + payload: + type: string + agent_id: + type: string + policy_id: + type: string + stream_id: + type: string + action_id: + type: string + required: + - type + - subtype + - timestamp + - message + - agent_id + upgrade_agent: + title: UpgradeAgent + oneOf: + - type: object + properties: + version: + type: string + required: + - version + - type: object + properties: + version: + type: string + source_uri: + type: string + required: + - version + bulk_upgrade_agents: + title: BulkUpgradeAgents + oneOf: + - type: object + properties: + version: + type: string + agents: + type: array + items: + type: string + required: + - version + - agents + - type: object + properties: + version: + type: string + source_uri: + type: string + agents: + type: array + items: + type: string + required: + - version + - agents + - type: object + properties: + version: + type: string + source_uri: + type: string + agents: + type: string + required: + - version + - agents + agent_type: + type: string + title: AgentType + enum: + - PERMANENT + - EPHEMERAL + - TEMPORARY + agent_event: + title: AgentEvent + allOf: + - type: object + properties: + id: + type: string + required: + - id + - $ref: '#/components/schemas/new_agent_event' + agent_status: + type: string + title: AgentStatus + enum: + - offline + - error + - online + - inactive + - warning + agent: + title: Agent + type: object + properties: + type: + $ref: '#/components/schemas/agent_type' + active: + type: boolean + enrolled_at: + type: string + unenrolled_at: + type: string + unenrollment_started_at: + type: string + shared_id: + type: string + access_api_key_id: + type: string + default_api_key_id: + type: string + policy_id: + type: string + policy_revision: + type: number + last_checkin: + type: string + user_provided_metadata: + $ref: '#/components/schemas/agent_metadata' + local_metadata: + $ref: '#/components/schemas/agent_metadata' + id: + type: string + current_error_events: + type: array + items: + $ref: '#/components/schemas/agent_event' + access_api_key: + type: string + status: + $ref: '#/components/schemas/agent_status' + default_api_key: + type: string + required: + - type + - active + - enrolled_at + - id + - current_error_events + - status + search_result: + title: SearchResult + type: object + properties: + description: + type: string + download: + type: string + icons: + type: string + name: + type: string + path: + type: string + title: + type: string + type: + type: string + version: + type: string + status: + type: string + savedObject: + type: object + required: + - description + - download + - icons + - name + - path + - title + - type + - version + - status + package_info: + title: PackageInfo + type: object + properties: + name: + type: string + title: + type: string + version: + type: string + readme: + type: string + description: + type: string + type: + type: string + categories: + type: array + items: + type: string + requirement: + oneOf: + - properties: + kibana: + type: object + properties: + versions: + type: string + - properties: + elasticsearch: + type: object + properties: + versions: + type: string + type: object + screenshots: + type: array + items: + type: object + properties: + src: + type: string + path: + type: string + title: + type: string + size: + type: string + type: + type: string + required: + - src + - path + icons: + type: array + items: + type: string + assets: + type: array + items: + type: string + internal: + type: boolean + format_version: + type: string + data_streams: + type: array + items: + type: object + properties: + title: + type: string + name: + type: string + release: + type: string + ingeset_pipeline: + type: string + vars: + type: array + items: + type: object + properties: + name: + type: string + default: + type: string + required: + - name + - default + type: + type: string + package: + type: string + required: + - title + - name + - release + - ingeset_pipeline + - type + - package + download: + type: string + path: + type: string + removable: + type: boolean + required: + - name + - title + - version + - description + - type + - categories + - requirement + - assets + - format_version + - download + - path +security: + - basicAuth: [] diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/README.md b/x-pack/plugins/ingest_manager/common/openapi/components/README.md new file mode 100644 index 0000000000000..1579c2d2b6eb5 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/README.md @@ -0,0 +1,13 @@ +Reusable components +=========== + +* Created the following folders for the various OpenAPI component types: + - `schemas` - reusable [Schema Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#schemaObject) + - `responses` - reusable [Response Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject) + - `parameters` - reusable [Parameter Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#parameterObject) + - `examples` - reusable [Example Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#exampleObject) + - `headers` - reusable [Header Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#headerObject) + - `request_bodies` - reusable [Request Body Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#requestBodyObject) + - `links` - reusable [Link Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#linkObject) + - `callbacks` - reusable [Callback Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#callbackObject) + - `security_schemes` - reusable [Security Scheme Objects](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#securitySchemeObject) diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/headers/kbn_xsrf.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/headers/kbn_xsrf.yaml new file mode 100644 index 0000000000000..3d8dfae634e68 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/headers/kbn_xsrf.yaml @@ -0,0 +1,5 @@ +schema: + type: string +in: header +name: kbn-xsrf +required: true diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/parameters/kuery.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/parameters/kuery.yaml new file mode 100644 index 0000000000000..b96ffd54d37ce --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/parameters/kuery.yaml @@ -0,0 +1,5 @@ +name: kuery +in: query +required: false +schema: + type: string diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_index.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_index.yaml new file mode 100644 index 0000000000000..908c19583045b --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_index.yaml @@ -0,0 +1,6 @@ +name: page +in: query +required: false +schema: + type: integer + default: 1 diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_size.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_size.yaml new file mode 100644 index 0000000000000..698491def3b39 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/parameters/page_size.yaml @@ -0,0 +1,7 @@ +name: perPage +in: query +description: The number of items to return +required: false +schema: + type: integer + default: 50 diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/access_api_key.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/access_api_key.yaml new file mode 100644 index 0000000000000..31e2072ddefbe --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/access_api_key.yaml @@ -0,0 +1,3 @@ +type: string +title: AccessApiKey +format: byte diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent.yaml new file mode 100644 index 0000000000000..df106093a8d8d --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent.yaml @@ -0,0 +1,48 @@ +title: Agent +type: object +properties: + type: + $ref: ./agent_type.yaml + active: + type: boolean + enrolled_at: + type: string + unenrolled_at: + type: string + unenrollment_started_at: + type: string + shared_id: + type: string + access_api_key_id: + type: string + default_api_key_id: + type: string + policy_id: + type: string + policy_revision: + type: number + last_checkin: + type: string + user_provided_metadata: + $ref: ./agent_metadata.yaml + local_metadata: + $ref: ./agent_metadata.yaml + id: + type: string + current_error_events: + type: array + items: + $ref: ./agent_event.yaml + access_api_key: + type: string + status: + $ref: ./agent_status.yaml + default_api_key: + type: string +required: + - type + - active + - enrolled_at + - id + - current_error_events + - status diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_event.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_event.yaml new file mode 100644 index 0000000000000..ada709378a9b1 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_event.yaml @@ -0,0 +1,9 @@ +title: AgentEvent +allOf: + - type: object + properties: + id: + type: string + required: + - id + - $ref: ./new_agent_event.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_metadata.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_metadata.yaml new file mode 100644 index 0000000000000..d37321f59a58b --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_metadata.yaml @@ -0,0 +1,2 @@ +title: AgentMetadata +type: object diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_policy.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_policy.yaml new file mode 100644 index 0000000000000..7395e45365ea9 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_policy.yaml @@ -0,0 +1,30 @@ +allOf: + - $ref: ./new_agent_policy.yaml + - type: object + properties: + id: + type: string + status: + type: string + enum: + - active + - inactive + packagePolicies: + oneOf: + - items: + type: string + - items: + $ref: ./package_policy.yaml + type: array + updated_on: + type: string + format: date-time + updated_by: + type: string + revision: + type: number + agents: + type: number + required: + - id + - status diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_status.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_status.yaml new file mode 100644 index 0000000000000..076a7cc5036bb --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_status.yaml @@ -0,0 +1,8 @@ +type: string +title: AgentStatus +enum: + - offline + - error + - online + - inactive + - warning diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_type.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_type.yaml new file mode 100644 index 0000000000000..da42f95c9e1d9 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/agent_type.yaml @@ -0,0 +1,6 @@ +type: string +title: AgentType +enum: + - PERMANENT + - EPHEMERAL + - TEMPORARY diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/bulk_upgrade_agents.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/bulk_upgrade_agents.yaml new file mode 100644 index 0000000000000..da06aa6fa8252 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/bulk_upgrade_agents.yaml @@ -0,0 +1,37 @@ +title: BulkUpgradeAgents +oneOf: + - type: object + properties: + version: + type: string + agents: + type: array + items: + type: string + required: + - version + - agents + - type: object + properties: + version: + type: string + source_uri: + type: string + agents: + type: array + items: + type: string + required: + - version + - agents + - type: object + properties: + version: + type: string + source_uri: + type: string + agents: + type: string + required: + - version + - agents diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/enrollment_api_key.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/enrollment_api_key.yaml new file mode 100644 index 0000000000000..3efe77b3bd606 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/enrollment_api_key.yaml @@ -0,0 +1,3 @@ +type: string +title: EnrollmentApiKey +format: byte diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_event.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_event.yaml new file mode 100644 index 0000000000000..ee4ddfb5f004d --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_event.yaml @@ -0,0 +1,44 @@ +title: NewAgentEvent +type: object +properties: + type: + type: string + enum: + - STATE + - ERROR + - ACTION_RESULT + - ACTION + subtype: + type: string + enum: + - RUNNING + - STARTING + - IN_PROGRESS + - CONFIG + - FAILED + - STOPPING + - STOPPED + - DEGRADED + - DATA_DUMP + - ACKNOWLEDGED + - UNKNOWN + timestamp: + type: string + message: + type: string + payload: + type: string + agent_id: + type: string + policy_id: + type: string + stream_id: + type: string + action_id: + type: string +required: + - type + - subtype + - timestamp + - message + - agent_id diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_policy.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_policy.yaml new file mode 100644 index 0000000000000..7070876cbea59 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_agent_policy.yaml @@ -0,0 +1,9 @@ +title: NewAgentPolicy +type: object +properties: + name: + type: string + namespace: + type: string + description: + type: string diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_package_policy.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_package_policy.yaml new file mode 100644 index 0000000000000..61b1fa678d407 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/new_package_policy.yaml @@ -0,0 +1,58 @@ +title: NewPackagePolicy +type: object +description: '' +properties: + enabled: + type: boolean + package: + type: object + properties: + name: + type: string + version: + type: string + title: + type: string + required: + - name + - version + - title + namespace: + type: string + output_id: + type: string + inputs: + type: array + items: + type: object + properties: + type: + type: string + enabled: + type: boolean + processors: + type: array + items: + type: string + streams: + type: array + items: {} + config: + type: object + vars: + type: object + required: + - type + - enabled + - streams + policy_id: + type: string + name: + type: string + description: + type: string +required: + - output_id + - inputs + - policy_id + - name diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_info.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_info.yaml new file mode 100644 index 0000000000000..3e0742c1879cb --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_info.yaml @@ -0,0 +1,118 @@ +title: PackageInfo +type: object +properties: + name: + type: string + title: + type: string + version: + type: string + readme: + type: string + description: + type: string + type: + type: string + categories: + type: array + items: + type: string + requirement: + oneOf: + - properties: + kibana: + type: object + properties: + versions: + type: string + - properties: + elasticsearch: + type: object + properties: + versions: + type: string + type: object + screenshots: + type: array + items: + type: object + properties: + src: + type: string + path: + type: string + title: + type: string + size: + type: string + type: + type: string + required: + - src + - path + icons: + type: array + items: + type: string + assets: + type: array + items: + type: string + internal: + type: boolean + format_version: + type: string + data_streams: + type: array + items: + type: object + properties: + title: + type: string + name: + type: string + release: + type: string + ingeset_pipeline: + type: string + vars: + type: array + items: + type: object + properties: + name: + type: string + default: + type: string + required: + - name + - default + type: + type: string + package: + type: string + required: + - title + - name + - release + - ingeset_pipeline + - type + - package + download: + type: string + path: + type: string + removable: + type: boolean +required: + - name + - title + - version + - description + - type + - categories + - requirement + - assets + - format_version + - download + - path diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_policy.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_policy.yaml new file mode 100644 index 0000000000000..99bc64f793379 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/package_policy.yaml @@ -0,0 +1,15 @@ +title: PackagePolicy +allOf: + - type: object + properties: + id: + type: string + revision: + type: number + inputs: + type: array + items: {} + required: + - id + - revision + - $ref: ./new_package_policy.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/search_result.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/search_result.yaml new file mode 100644 index 0000000000000..b67ff61c5ab60 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/search_result.yaml @@ -0,0 +1,33 @@ +title: SearchResult +type: object +properties: + description: + type: string + download: + type: string + icons: + type: string + name: + type: string + path: + type: string + title: + type: string + type: + type: string + version: + type: string + status: + type: string + savedObject: + type: object +required: + - description + - download + - icons + - name + - path + - title + - type + - version + - status diff --git a/x-pack/plugins/ingest_manager/common/openapi/components/schemas/upgrade_agent.yaml b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/upgrade_agent.yaml new file mode 100644 index 0000000000000..11a2b5846ba1e --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/components/schemas/upgrade_agent.yaml @@ -0,0 +1,16 @@ +title: UpgradeAgent +oneOf: + - type: object + properties: + version: + type: string + required: + - version + - type: object + properties: + version: + type: string + source_uri: + type: string + required: + - version diff --git a/x-pack/plugins/ingest_manager/common/openapi/entrypoint.yaml b/x-pack/plugins/ingest_manager/common/openapi/entrypoint.yaml new file mode 100644 index 0000000000000..791d3da56783e --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/entrypoint.yaml @@ -0,0 +1,77 @@ +openapi: 3.0.0 +info: + title: Ingest Manager + version: '0.2' + contact: + name: Ingest Team + license: + name: Elastic +servers: + - url: 'http://localhost:5601/api/fleet' + description: local +paths: + /agent_policies: + $ref: paths/agent_policies.yaml + '/agent_policies/{agentPolicyId}': + $ref: 'paths/agent_policies@{agent_policy_id}.yaml' + '/agent_policies/{agentPolicyId}/copy': + $ref: 'paths/agent_policies@{agent_policy_id}@copy.yaml' + /agent_policies/delete: + $ref: paths/agent_policies@delete.yaml + /agent-status: + $ref: paths/agent_status.yaml + /agents: + $ref: paths/agents.yaml + '/agents/{agentId}/acks': + $ref: 'paths/agents@{agent_id}@acks.yaml' + '/agents/{agentId}/checkin': + $ref: 'paths/agents@{agent_id}@checkin.yaml' + '/agents/{agentId}/events': + $ref: 'paths/agents@{agent_id}@events.yaml' + '/agents/{agentId}/unenroll': + $ref: 'paths/agents@{agent_id}@unenroll.yaml' + '/agents/{agentId}/upgrade': + $ref: 'paths/agents@{agent_id}@upgrade.yaml' + /agents/bulk_upgrade: + $ref: paths/agents@bulk_upgrade.yaml + /agents/enroll: + $ref: paths/agents@enroll.yaml + /agents/setup: + $ref: paths/agents@setup.yaml + /enrollment-api-keys: + $ref: paths/enrollment_api_keys.yaml + '/enrollment-api-keys/{keyId}': + $ref: 'paths/enrollment_api_keys@{key_id}.yaml' + /epm/categories: + $ref: paths/epm@categories.yaml + /epm/packages: + $ref: paths/epm@packages.yaml + '/epm/packages/{pkgkey}': + $ref: 'paths/epm@packages@{pkgkey}.yaml' + '/agents/{agentId}': + $ref: 'paths/agents@{agent_id}.yaml' + '/install/{osType}': + $ref: 'paths/install@{os_type}.yaml' + /package_policies: + $ref: paths/package_policies.yaml + '/package_policies/{packagePolicyId}': + $ref: 'paths/package_policies@{package_policy_id}.yaml' + /setup: + $ref: paths/setup.yaml +components: + securitySchemes: + basicAuth: + type: http + scheme: basic + Enrollment API Key: + name: Authorization + type: apiKey + in: header + description: 'e.g. Authorization: ApiKey base64EnrollmentApiKey' + Access API Key: + name: Authorization + type: apiKey + in: header + description: 'e.g. Authorization: ApiKey base64AccessApiKey' +security: + - basicAuth: [] diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/README.md b/x-pack/plugins/ingest_manager/common/openapi/paths/README.md new file mode 100644 index 0000000000000..f5003e3e3473b --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/README.md @@ -0,0 +1,130 @@ +Paths +===== + +Organize our path definitions within this folder. We will reference our paths from our main `openapi.json` entrypoint file. + +It may help us to adopt some conventions: + +* path separator token (e.g. `@`) or subfolders +* path parameter (e.g. `{example}`) +* file-per-path or file-per-operation + +There are different benefits and drawbacks to each decision. + +We can adopt any organization we wish. We have some tips for organizing paths based on common practices. + +## Each path in a separate file + +Use a predefined "path separator" and keep all of our path files in the top level of the `paths` folder. + +``` +paths/ +├── README.md +├── agent_policies.yaml +├── agent_policies@delete.yaml +├── agent_policies@{agent_policy_id}.yaml +├── agent_policies@{agent_policy_id}@copy.yaml +├── agent_status.yaml +├── agents.yaml +├── agents@bulk_upgrade.yaml +├── agents@enroll.yaml +├── agents@setup.yaml +├── agents@{agent_id}.yaml +├── agents@{agent_id}@acks.yaml +├── agents@{agent_id}@checkin.yaml +├── agents@{agent_id}@events.yaml +├── agents@{agent_id}@unenroll.yaml +├── agents@{agent_id}@upgrade.yaml +├── enrollment_api_keys.yaml +├── enrollment_api_keys@{key_id}.yaml +├── epm@categories.yaml +├── epm@packages.yaml +├── epm@packages@{pkgkey}.yaml +├── install@{os_type}.yaml +├── package_policies.yaml +├── package_policies@{package_policy_id}.yaml +└── setup.yaml +``` + +Redocly recommends using the `@` character for this case. + +In addition, Redocly recommends placing path parameters within `{}` curly braces if we adopt this style. + +#### Motivations + +* Quickly see a list of all paths. Many people think in terms of the "number" of "endpoints" (paths), and not the "number" of "operations" (paths * http methods). + +* Only the "file-per-path" option is semantically correct with the OpenAPI Specification 3.0.2. However, Redocly's openapi-cli will build valid bundles for any of the other options too. + + +#### Drawbacks + +* This may require multiple definitions per http method within a single file. +* It requires settling on a path separator (that is allowed to be used in filenames) and sticking to that convention. + +## Each operation in a separate file + +We may also place each operation in a separate file. + +In this case, if we want all paths at the top-level, we can concatenate the http method to the path name. Similar to the above option, we can + +### Files at top-level of `paths` + +We may name our files with some concatenation for the http method. For example, following a convention such as: `-.json`. + +#### Motivations + +* Quickly see all operations without needing to navigate subfolders. + +#### Drawbacks + +* Adopting an unusual path separator convention, instead of using subfolders. + +### Use subfolders to mirror API path structure + +Example: +``` +GET /customers + +/paths/customers/get.json +``` + +In this case, the path id defined within subfolders which mirror the API URL structure. + +Example with path parameter: +``` +GET /customers/{id} + +/paths/customers/{id}/get.json +``` + +#### Motivations + +It matches the URL structure. + +It is pretty easy to reference: + +```json +paths: + '/customers/{id}': + get: + $ref: ./paths/customers/{id}/get.json + put: + $ref: ./paths/customers/{id}/put.json +``` + +#### Drawbacks + +If we have a lot of nested folders, it may be confusing to reference our schemas. + +Example +``` +file: /paths/customers/{id}/timeline/{messageId}/get.json + +# excerpt of file + headers: + Rate-Limit-Remaining: + $ref: ../../../../../components/headers/Rate-Limit-Remaining.json + +``` +Notice the `../../../../../` in the ref which requires some attention to formulate correctly. While openapi-cli has a linter which suggests possible refs when there is a mistake, this is still a net drawback for APIs with deep paths. diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies.yaml new file mode 100644 index 0000000000000..2ba14fba7232b --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies.yaml @@ -0,0 +1,54 @@ +get: + summary: Agent policy - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: ../components/schemas/agent_policy.yaml + total: + type: number + page: + type: number + perPage: + type: number + required: + - items + - total + - page + - perPage + operationId: agent-policy-list + parameters: + - $ref: ../components/parameters/page_size.yaml + - $ref: ../components/parameters/page_index.yaml + - $ref: ../components/parameters/kuery.yaml + description: '' +post: + summary: Agent policy - Create + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: ../components/schemas/agent_policy.yaml + operationId: post-agent-policy + requestBody: + content: + application/json: + schema: + $ref: ../components/schemas/new_agent_policy.yaml + security: [] + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@delete.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@delete.yaml new file mode 100644 index 0000000000000..ae975274d80e5 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@delete.yaml @@ -0,0 +1,33 @@ +post: + summary: Agent policy - Delete + operationId: post-agent-policy-delete + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + success: + type: boolean + required: + - id + - success + requestBody: + content: + application/json: + schema: + type: object + properties: + agentPolicyIds: + type: array + items: + type: string + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml +parameters: [] diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}.yaml new file mode 100644 index 0000000000000..15910b0116b7f --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}.yaml @@ -0,0 +1,47 @@ +parameters: + - schema: + type: string + name: agentPolicyId + in: path + required: true +get: + summary: Agent policy - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: ../components/schemas/agent_policy.yaml + required: + - item + operationId: agent-policy-info + description: Get one agent policy + parameters: [] +put: + summary: Agent policy - Update + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: ../components/schemas/agent_policy.yaml + required: + - item + operationId: put-agent-policy-agentPolicyId + requestBody: + content: + application/json: + schema: + $ref: ../components/schemas/new_agent_policy.yaml + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}@copy.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}@copy.yaml new file mode 100644 index 0000000000000..4b42f8cab0677 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_policies@{agent_policy_id}@copy.yaml @@ -0,0 +1,35 @@ +parameters: + - schema: + type: string + name: agentPolicyId + in: path + required: true +post: + summary: Agent policy - copy one policy + operationId: agent-policy-copy + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: ../components/schemas/agent_policy.yaml + required: + - item + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + description: + type: string + required: + - name + description: '' + description: Copies one agent policy diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agent_status.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_status.yaml new file mode 100644 index 0000000000000..77ec9e85069a2 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agent_status.yaml @@ -0,0 +1,11 @@ +get: + summary: Fleet - Agent - Status for policy + tags: [] + responses: {} + operationId: get-fleet-agent-status + parameters: + - schema: + type: string + name: policyId + in: query + required: false diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents.yaml new file mode 100644 index 0000000000000..e5039bc2caccf --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents.yaml @@ -0,0 +1,29 @@ +get: + summary: Fleet - Agent - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + list: + type: array + items: + type: object + total: + type: number + page: + type: number + perPage: + type: number + required: + - list + - total + - page + - perPage + operationId: get-fleet-agents + security: + - basicAuth: [] diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@bulk_upgrade.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@bulk_upgrade.yaml new file mode 100644 index 0000000000000..2092fbf000ab8 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@bulk_upgrade.yaml @@ -0,0 +1,25 @@ +post: + summary: Fleet - Agent - Bulk Upgrade + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: ../components/schemas/bulk_upgrade_agents.yaml + '400': + description: BAD REQUEST + content: + application/json: + schema: + $ref: ../components/schemas/upgrade_agent.yaml + operationId: post-fleet-agents-bulk-upgrade + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + requestBody: + required: true + content: + application/json: + schema: + $ref: ../components/schemas/bulk_upgrade_agents.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@enroll.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@enroll.yaml new file mode 100644 index 0000000000000..a0c1c8c28e721 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@enroll.yaml @@ -0,0 +1,47 @@ +post: + summary: Fleet - Agent - Enroll + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + action: + type: string + item: + $ref: ../components/schemas/agent.yaml + operationId: post-fleet-agents-enroll + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + requestBody: + content: + application/json: + schema: + type: object + properties: + type: + type: string + enum: + - PERMANENT + - EPHEMERAL + - TEMPORARY + shared_id: + type: string + metadata: + type: object + required: + - local + - user_provided + properties: + local: + $ref: ../components/schemas/agent_metadata.yaml + user_provided: + $ref: ../components/schemas/agent_metadata.yaml + required: + - type + - metadata + security: + - Enrollment API Key: [] diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@setup.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@setup.yaml new file mode 100644 index 0000000000000..87556dca0afbb --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@setup.yaml @@ -0,0 +1,48 @@ +get: + summary: Agents setup - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + isInitialized: + type: boolean + required: + - isInitialized + operationId: get-agents-setup + security: + - basicAuth: [] +post: + summary: Agents setup - Create + operationId: post-agents-setup + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + isInitialized: + type: boolean + required: + - isInitialized + requestBody: + content: + application/json: + schema: + type: object + properties: + admin_username: + type: string + admin_password: + type: string + required: + - admin_username + - admin_password + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}.yaml new file mode 100644 index 0000000000000..e65c80d8fae88 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}.yaml @@ -0,0 +1,36 @@ +parameters: + - schema: + type: string + name: agentId + in: path + required: true +get: + summary: Fleet - Agent - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + type: object + required: + - item + operationId: get-fleet-agents-agentId +put: + summary: Fleet - Agent - Update + tags: [] + responses: {} + operationId: put-fleet-agents-agentId + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml +delete: + summary: Fleet - Agent - Delete + tags: [] + responses: {} + operationId: delete-fleet-agents-agentId + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@acks.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@acks.yaml new file mode 100644 index 0000000000000..6728554bf542e --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@acks.yaml @@ -0,0 +1,32 @@ +parameters: + - schema: + type: string + name: agentId + in: path + required: true +post: + summary: Fleet - Agent - Acks + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + action: + type: string + enum: + - acks + required: + - action + operationId: post-fleet-agents-agentId-acks + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + requestBody: + content: + application/json: + schema: + type: object + properties: {} diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@checkin.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@checkin.yaml new file mode 100644 index 0000000000000..cc797c7356603 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@checkin.yaml @@ -0,0 +1,60 @@ +parameters: + - schema: + type: string + name: agentId + in: path + required: true +post: + summary: Fleet - Agent - Check In + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + action: + type: string + enum: + - checkin + actions: + type: array + items: + type: object + properties: + agent_id: + type: string + data: + type: object + id: + type: string + created_at: + type: string + format: date-time + type: + type: string + required: + - agent_id + - data + - id + - created_at + - type + operationId: post-fleet-agents-agentId-checkin + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + security: + - Access API Key: [] + requestBody: + content: + application/json: + schema: + type: object + properties: + local_metadata: + $ref: ../components/schemas/agent_metadata.yaml + events: + type: array + items: + $ref: ../components/schemas/new_agent_event.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@events.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@events.yaml new file mode 100644 index 0000000000000..db8d28f72b5a2 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@events.yaml @@ -0,0 +1,11 @@ +parameters: + - schema: + type: string + name: agentId + in: path + required: true +get: + summary: Fleet - Agent - Events + tags: [] + responses: {} + operationId: get-fleet-agents-agentId-events diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@unenroll.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@unenroll.yaml new file mode 100644 index 0000000000000..00c9cdfbcf4ae --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@unenroll.yaml @@ -0,0 +1,21 @@ +parameters: + - schema: + type: string + name: agentId + in: path + required: true +post: + summary: Fleet - Agent - Unenroll + tags: [] + responses: {} + operationId: post-fleet-agents-unenroll + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + requestBody: + content: + application/json: + schema: + type: object + properties: + force: + type: boolean diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@upgrade.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@upgrade.yaml new file mode 100644 index 0000000000000..ce871cac0d068 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/agents@{agent_id}@upgrade.yaml @@ -0,0 +1,32 @@ +parameters: + - schema: + type: string + name: agentId + in: path + required: true +post: + summary: Fleet - Agent - Upgrade + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: ../components/schemas/upgrade_agent.yaml + '400': + description: BAD REQUEST + content: + application/json: + schema: + $ref: ../components/schemas/upgrade_agent.yaml + operationId: post-fleet-agents-upgrade + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml + requestBody: + required: true + content: + application/json: + schema: + $ref: ../components/schemas/upgrade_agent.yaml + diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys.yaml new file mode 100644 index 0000000000000..22d27c0596d68 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys.yaml @@ -0,0 +1,13 @@ +get: + summary: Enrollment - List + tags: [] + responses: {} + operationId: get-fleet-enrollment-api-keys + parameters: [] +post: + summary: Enrollment - Create + tags: [] + responses: {} + operationId: post-fleet-enrollment-api-keys + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys@{key_id}.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys@{key_id}.yaml new file mode 100644 index 0000000000000..3b43950427e82 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/enrollment_api_keys@{key_id}.yaml @@ -0,0 +1,18 @@ +parameters: + - schema: + type: string + name: keyId + in: path + required: true +get: + summary: Enrollment - Info + tags: [] + responses: {} + operationId: get-fleet-enrollment-api-keys-keyId +delete: + summary: Enrollment - Delete + tags: [] + responses: {} + operationId: delete-fleet-enrollment-api-keys-keyId + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/epm@categories.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/epm@categories.yaml new file mode 100644 index 0000000000000..0fc26a4e5c826 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/epm@categories.yaml @@ -0,0 +1,24 @@ +get: + summary: EPM - Categories + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + type: object + properties: + id: + type: string + title: + type: string + count: + type: number + required: + - id + - title + - count + operationId: get-epm-categories diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages.yaml new file mode 100644 index 0000000000000..afbe8ee2dc321 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages.yaml @@ -0,0 +1,14 @@ +get: + summary: EPM - Packages - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: array + items: + $ref: ../components/schemas/search_result.yaml + operationId: get-epm-list +parameters: [] diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages@{pkgkey}.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages@{pkgkey}.yaml new file mode 100644 index 0000000000000..43937aa153f50 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/epm@packages@{pkgkey}.yaml @@ -0,0 +1,91 @@ +get: + summary: EPM - Packages - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + allOf: + - properties: + response: + $ref: ../components/schemas/package_info.yaml + - properties: + status: + type: string + enum: + - installed + - not_installed + savedObject: + type: string + required: + - status + - savedObject + operationId: get-epm-package-pkgkey + security: + - basicAuth: [] +parameters: + - schema: + type: string + name: pkgkey + in: path + required: true +post: + summary: EPM - Packages - Install + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + response: + type: array + items: + type: object + properties: + id: + type: string + type: + type: string + required: + - id + - type + required: + - response + operationId: post-epm-install-pkgkey + description: '' + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml +delete: + summary: EPM - Packages - Delete + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + response: + type: array + items: + type: object + properties: + id: + type: string + type: + type: string + required: + - id + - type + required: + - response + operationId: post-epm-delete-pkgkey + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/install@{os_type}.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/install@{os_type}.yaml new file mode 100644 index 0000000000000..80351aa7ae119 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/install@{os_type}.yaml @@ -0,0 +1,11 @@ +parameters: + - schema: + type: string + name: osType + in: path + required: true +get: + summary: Fleet - Get OS install script + tags: [] + responses: {} + operationId: get-fleet-install-osType diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/package_policies.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/package_policies.yaml new file mode 100644 index 0000000000000..47eca50f0524b --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/package_policies.yaml @@ -0,0 +1,40 @@ +get: + summary: PackagePolicies - List + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + items: + type: array + items: + $ref: ../components/schemas/package_policy.yaml + total: + type: number + page: + type: number + perPage: + type: number + required: + - items + operationId: get-packagePolicies + security: [] + parameters: [] +parameters: [] +post: + summary: PackagePolicies - Create + operationId: post-packagePolicies + responses: + '200': + description: OK + requestBody: + content: + application/json: + schema: + $ref: ../components/schemas/new_package_policy.yaml + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/package_policies@{package_policy_id}.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/package_policies@{package_policy_id}.yaml new file mode 100644 index 0000000000000..3b177be3d032e --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/package_policies@{package_policy_id}.yaml @@ -0,0 +1,42 @@ +get: + summary: PackagePolicies - Info + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: ../components/schemas/package_policy.yaml + required: + - item + operationId: get-packagePolicies-packagePolicyId +parameters: + - schema: + type: string + name: packagePolicyId + in: path + required: true +put: + summary: PackagePolicies - Update + operationId: put-packagePolicies-packagePolicyId + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + item: + $ref: ../components/schemas/package_policy.yaml + sucess: + type: boolean + required: + - item + - sucess + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/paths/setup.yaml b/x-pack/plugins/ingest_manager/common/openapi/paths/setup.yaml new file mode 100644 index 0000000000000..62ad2cb66dacb --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/openapi/paths/setup.yaml @@ -0,0 +1,25 @@ +post: + summary: Ingest Manager - Setup + tags: [] + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + isInitialized: + type: boolean + '500': + description: Internal Server Error + content: + application/json: + schema: + type: object + properties: + message: + type: string + operationId: post-setup + parameters: + - $ref: ../components/headers/kbn_xsrf.yaml diff --git a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json b/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json deleted file mode 100644 index 69974a87434a1..0000000000000 --- a/x-pack/plugins/ingest_manager/common/openapi/spec_oas3.json +++ /dev/null @@ -1,4538 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "Ingest Manager", - "version": "0.2", - "contact": { - "name": "Ingest Team" - }, - "license": { - "name": "Elastic" - } - }, - "servers": [ - { - "url": "http://localhost:5601/api/fleet", - "description": "local" - } - ], - "paths": { - "/agent_policies": { - "get": { - "summary": "Agent policy - List", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AgentPolicy" - } - }, - "total": { - "type": "number" - }, - "page": { - "type": "number" - }, - "perPage": { - "type": "number" - } - }, - "required": ["items", "total", "page", "perPage"] - }, - "examples": { - "success": { - "value": { - "items": [ - { - "id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", - "name": "Default policy", - "namespace": "default", - "description": "Default agent policy created by Kibana", - "status": "active", - "packagePolicies": ["8a5679b0-8fbf-11ea-b2ce-01c4a6127154"], - "is_default": true, - "monitoring_enabled": ["logs", "metrics"], - "revision": 2, - "updated_on": "2020-05-06T17:32:21.905Z", - "updated_by": "system", - "agents": 0 - } - ], - "total": 1, - "page": 1, - "perPage": 50 - } - } - } - } - } - } - }, - "operationId": "agent-policy-list", - "parameters": [ - { - "$ref": "#/components/parameters/pageSizeParam" - }, - { - "$ref": "#/components/parameters/pageIndexParam" - }, - { - "$ref": "#/components/parameters/kueryParam" - } - ], - "description": "" - }, - "post": { - "summary": "Agent policy - Create", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/AgentPolicy" - } - } - } - } - } - } - }, - "operationId": "post-agent-policy", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NewAgentPolicy" - } - } - } - }, - "security": [], - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/agent_policies/{agentPolicyId}": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentPolicyId", - "in": "path", - "required": true - } - ], - "get": { - "summary": "Agent policy - Info", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/AgentPolicy" - } - }, - "required": ["item"] - }, - "examples": { - "success": { - "value": { - "item": { - "id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", - "name": "Default policy", - "namespace": "default", - "description": "Default agent policy created by Kibana", - "status": "active", - "packagePolicies": [ - { - "id": "8a5679b0-8fbf-11ea-b2ce-01c4a6127154", - "name": "system-1", - "namespace": "default", - "package": { - "name": "system", - "title": "System", - "version": "0.0.3" - }, - "enabled": true, - "policy_id": "82da1fc0-8fbf-11ea-b2ce-01c4a6127154", - "output_id": "08adc51c-69f3-4294-80e2-24527c6ff73d", - "inputs": [ - { - "type": "logs", - "enabled": true, - "streams": [ - { - "id": "logs-system.auth", - "enabled": true, - "dataset": "system.auth", - "vars": { - "paths": { - "value": ["/var/log/auth.log*", "/var/log/secure*"], - "type": "text" - } - }, - "agent_stream": { - "paths": ["/var/log/auth.log*", "/var/log/secure*"], - "exclude_files": [".gz$"], - "multiline": { - "pattern": "^\\s", - "match": "after" - }, - "processors": [ - { - "add_locale": null - }, - { - "add_fields": { - "target": "", - "fields": { - "ecs.version": "1.5.0" - } - } - } - ] - } - }, - { - "id": "logs-system.syslog", - "enabled": true, - "dataset": "system.syslog", - "vars": { - "paths": { - "value": ["/var/log/messages*", "/var/log/syslog*"], - "type": "text" - } - }, - "agent_stream": { - "paths": ["/var/log/messages*", "/var/log/syslog*"], - "exclude_files": [".gz$"], - "multiline": { - "pattern": "^\\s", - "match": "after" - }, - "processors": [ - { - "add_locale": null - }, - { - "add_fields": { - "target": "", - "fields": { - "ecs.version": "1.5.0" - } - } - } - ] - } - } - ] - }, - { - "type": "system/metrics", - "enabled": true, - "streams": [ - { - "id": "system/metrics-system.core", - "enabled": true, - "dataset": "system.core", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["core"], - "core.metrics": "percentages" - } - }, - { - "id": "system/metrics-system.cpu", - "enabled": true, - "dataset": "system.cpu", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["cpu"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.diskio", - "enabled": true, - "dataset": "system.diskio", - "agent_stream": { - "metricsets": ["diskio"] - } - }, - { - "id": "system/metrics-system.entropy", - "enabled": true, - "dataset": "system.entropy", - "agent_stream": { - "metricsets": ["entropy"] - } - }, - { - "id": "system/metrics-system.filesystem", - "enabled": true, - "dataset": "system.filesystem", - "vars": { - "period": { - "value": "1m", - "type": "text" - }, - "processors": { - "value": "- drop_event.when.regexp:\n system.filesystem.mount_point: ^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)\n", - "type": "yaml" - } - }, - "agent_stream": { - "metricsets": ["filesystem"], - "period": "1m", - "processors": [ - { - "drop_event.when.regexp": { - "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" - } - } - ] - } - }, - { - "id": "system/metrics-system.fsstat", - "enabled": true, - "dataset": "system.fsstat", - "vars": { - "period": { - "value": "1m", - "type": "text" - }, - "processors": { - "value": "- drop_event.when.regexp:\n system.filesystem.mount_point: ^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)\n", - "type": "yaml" - } - }, - "agent_stream": { - "metricsets": ["fsstat"], - "period": "1m", - "processors": [ - { - "drop_event.when.regexp": { - "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" - } - } - ] - } - }, - { - "id": "system/metrics-system.load", - "enabled": true, - "dataset": "system.load", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["load"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.memory", - "enabled": true, - "dataset": "system.memory", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["memory"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.network", - "enabled": true, - "dataset": "system.network", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["network"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.network_summary", - "enabled": true, - "dataset": "system.network_summary", - "agent_stream": { - "metricsets": ["network_summary"] - } - }, - { - "id": "system/metrics-system.process", - "enabled": true, - "dataset": "system.process", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["process"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.process_summary", - "enabled": true, - "dataset": "system.process_summary", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["process_summary"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.raid", - "enabled": true, - "dataset": "system.raid", - "agent_stream": { - "metricsets": ["raid"] - } - }, - { - "id": "system/metrics-system.service", - "enabled": true, - "dataset": "system.service", - "agent_stream": { - "metricsets": ["service"] - } - }, - { - "id": "system/metrics-system.socket", - "enabled": true, - "dataset": "system.socket", - "agent_stream": { - "metricsets": ["socket"] - } - }, - { - "id": "system/metrics-system.socket_summary", - "enabled": true, - "dataset": "system.socket_summary", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "process.include_top_n.by_cpu": { - "value": 5, - "type": "integer" - }, - "process.include_top_n.by_memory": { - "value": 5, - "type": "integer" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["socket_summary"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - } - }, - { - "id": "system/metrics-system.uptime", - "enabled": true, - "dataset": "system.uptime", - "vars": { - "core.metrics": { - "value": ["percentages"], - "type": "text" - }, - "cpu.metrics": { - "value": ["percentages", "normalized_percentages"], - "type": "text" - }, - "period": { - "value": "10s", - "type": "text" - }, - "processes": { - "value": [".*"], - "type": "text" - } - }, - "agent_stream": { - "metricsets": ["uptime"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "processes": ".*" - } - }, - { - "id": "system/metrics-system.users", - "enabled": true, - "dataset": "system.users", - "agent_stream": { - "metricsets": ["users"] - } - } - ] - } - ], - "revision": 1 - } - ], - "is_default": true, - "monitoring_enabled": ["logs", "metrics"], - "revision": 2, - "updated_on": "2020-05-06T17:32:21.905Z", - "updated_by": "system" - } - } - } - } - } - } - } - }, - "operationId": "agent-policy-info", - "description": "Get one agent policy", - "parameters": [] - }, - "put": { - "summary": "Agent policy - Update", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/AgentPolicy" - } - }, - "required": ["item"] - }, - "examples": { - "example-1": { - "value": { - "item": { - "id": "0b7130d0-5a37-11ea-ac2c-25e9ab4ecb2a", - "name": "UPDATED name", - "description": "UPDATED description", - "namespace": "UPDATED namespace", - "updated_on": "Fri Feb 28 2020 16:22:31 GMT-0500 (Eastern Standard Time)", - "updated_by": "elastic", - "packagePolicies": [] - } - } - } - } - } - } - } - }, - "operationId": "put-agent-policy-agentPolicyId", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NewAgentPolicy" - }, - "examples": { - "example-1": { - "value": { - "name": "UPDATED name", - "description": "UPDATED description", - "namespace": "UPDATED namespace" - } - } - } - } - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/agent_policies/{agentPolicyId}/copy": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentPolicyId", - "in": "path", - "required": true - } - ], - "post": { - "summary": "Agent policy - copy one policy", - "operationId": "agent-policy-copy", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/AgentPolicy" - } - }, - "required": ["item"] - } - } - } - } - }, - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "required": ["name"] - }, - "examples": {} - } - }, - "description": "" - }, - "description": "Copies one agent policy" - } - }, - "/agent_policies/delete": { - "post": { - "summary": "Agent policy - Delete", - "operationId": "post-agent-policy-delete", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "success": { - "type": "boolean" - } - }, - "required": ["id", "success"] - } - }, - "examples": { - "success": { - "value": [ - { - "id": "df7d2540-5a47-11ea-80da-89b5a66da347", - "success": true - } - ] - }, - "fail": { - "value": [ - { - "id": "df7d2540-5a47-11ea-80da-89b5a66da347", - "success": false - } - ] - } - } - } - } - } - }, - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "agentPolicyIds": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "examples": { - "example-1": { - "value": { - "agentPolicyIds": ["df7d2540-5a47-11ea-80da-89b5a66da347"] - } - } - } - } - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - }, - "parameters": [] - }, - "/package_policies": { - "get": { - "summary": "PackagePolicies - List", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PackagePolicy" - } - }, - "total": { - "type": "number" - }, - "page": { - "type": "number" - }, - "perPage": { - "type": "number" - } - }, - "required": ["items"] - }, - "examples": { - "example-1": { - "value": { - "items": [ - { - "id": "5d273cf0-5a44-11ea-80da-89b5a66da347", - "use_output": "default", - "inputs": [ - { - "type": "docker/metrics", - "streams": [ - { - "metricset": "status", - "dataset": "docker.status" - } - ] - }, - { - "type": "logs", - "streams": [ - { - "paths": ["/var/log/hello1.log", "/var/log/hello2.log"] - } - ] - } - ] - }, - { - "id": "66490980-5a44-11ea-80da-89b5a66da347", - "namespace": "testing", - "use_output": "default", - "inputs": [ - { - "type": "apache/metrics", - "streams": [ - { - "enabled": true, - "metricset": "info" - } - ] - } - ] - }, - { - "id": "df1ccae0-5a49-11ea-94a6-81affd263f47", - "enabled": true, - "title": "This is a nice title for human", - "package": { - "name": "epm/nginx", - "version": "1.7.0" - }, - "namespace": "prod", - "use_output": "long_term_storage", - "inputs": [ - { - "type": "logs", - "streams": [ - { - "enabled": true, - "dataset": "nginx.acccess", - "paths": ["/var/log/nginx/access.log"] - }, - { - "enabled": true, - "dataset": "nginx.error", - "paths": ["/var/log/nginx/error.log"] - } - ] - }, - { - "type": "nginx/metrics", - "streams": [ - { - "id": "id string", - "enabled": true, - "dataset": "nginx.stub_status", - "metricset": "stub_status" - } - ] - } - ] - }, - { - "id": "f96a09d0-5a49-11ea-94a6-81affd263f47", - "enabled": true, - "title": "This is a nice title for human", - "package": { - "name": "epm/nginx", - "version": "1.7.0" - }, - "namespace": "prod", - "use_output": "long_term_storage", - "inputs": [ - { - "type": "logs", - "streams": [ - { - "enabled": true, - "dataset": "nginx.acccess", - "paths": ["/var/log/nginx/access.log"] - }, - { - "enabled": true, - "dataset": "nginx.error", - "paths": ["/var/log/nginx/error.log"] - } - ] - }, - { - "type": "nginx/metrics", - "streams": [ - { - "id": "id string", - "enabled": true, - "dataset": "nginx.stub_status", - "metricset": "stub_status" - } - ] - } - ] - }, - { - "id": "9ca403a0-5a66-11ea-9468-c911a41ab4f5", - "enabled": true, - "title": "This is a nice title for human", - "package": { - "name": "epm/nginx", - "version": "1.7.0" - }, - "namespace": "prod", - "use_output": "long_term_storage", - "inputs": [ - { - "type": "logs", - "streams": [ - { - "enabled": true, - "dataset": "nginx.acccess", - "paths": ["/var/log/nginx/access.log"] - }, - { - "enabled": true, - "dataset": "nginx.error", - "paths": ["/var/log/nginx/error.log"] - } - ] - }, - { - "type": "nginx/metrics", - "streams": [ - { - "id": "id string", - "enabled": true, - "dataset": "nginx.stub_status", - "metricset": "stub_status" - } - ] - } - ] - }, - { - "id": "27925980-5a44-11ea-80da-89b5a66da347", - "enabled": true, - "title": "UPDATED title for human", - "package": { - "name": "epm/nginx", - "version": "1.7.0" - }, - "namespace": "prod", - "use_output": "long_term_storage", - "inputs": [ - { - "streams": [ - { - "paths": ["/var/log/nginx/access.log"], - "dataset": "nginx.acccess", - "enabled": true - }, - { - "paths": ["/var/log/nginx/error.log"], - "dataset": "nginx.error", - "enabled": true - } - ], - "type": "logs" - }, - { - "streams": [ - { - "metricset": "stub_status", - "id": "id string", - "dataset": "nginx.stub_status", - "enabled": true - } - ], - "type": "nginx/metrics" - } - ] - } - ], - "total": 6, - "page": 1, - "perPage": 20 - } - } - } - } - } - } - }, - "operationId": "get-packagePolicies", - "security": [], - "parameters": [] - }, - "parameters": [], - "post": { - "summary": "PackagePolicies - Create", - "operationId": "post-packagePolicies", - "responses": { - "200": { - "description": "OK" - } - }, - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NewPackagePolicy" - }, - "examples": { - "example-1": { - "value": { - "enabled": true, - "title": "This is a nice title for human", - "package": { - "name": "epm/nginx", - "version": "1.7.0" - }, - "namespace": "prod", - "use_output": "long_term_storage", - "inputs": [ - { - "type": "logs", - "streams": [ - { - "enabled": true, - "dataset": "nginx.acccess", - "paths": ["/var/log/nginx/access.log"] - }, - { - "enabled": true, - "dataset": "nginx.error", - "paths": ["/var/log/nginx/error.log"] - } - ] - }, - { - "type": "nginx/metrics", - "streams": [ - { - "id": "id string", - "enabled": true, - "dataset": "nginx.stub_status", - "metricset": "stub_status" - } - ] - } - ] - } - } - } - } - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/package_policies/{packagePolicyId}": { - "get": { - "summary": "PackagePolicies - Info", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/PackagePolicy" - } - }, - "required": ["item"] - } - } - } - } - }, - "operationId": "get-packagePolicies-packagePolicyId" - }, - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "packagePolicyId", - "in": "path", - "required": true - } - ], - "put": { - "summary": "PackagePolicies - Update", - "operationId": "put-packagePolicies-packagePolicyId", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "$ref": "#/components/schemas/PackagePolicy" - }, - "sucess": { - "type": "boolean" - } - }, - "required": ["item", "sucess"] - } - } - } - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/agents/setup": { - "get": { - "summary": "Agents setup - Info", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "isInitialized": { - "type": "boolean" - } - }, - "required": ["isInitialized"] - }, - "examples": { - "success": { - "value": { - "isInitialized": true - } - }, - "failure": { - "value": { - "isInitialized": false - } - } - } - } - } - } - }, - "operationId": "get-agents-setup", - "security": [ - { - "basicAuth": [] - } - ] - }, - "post": { - "summary": "Agents setup - Create", - "operationId": "post-agents-setup", - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "isInitialized": { - "type": "boolean" - } - }, - "required": ["isInitialized"] - }, - "examples": { - "success": { - "value": { - "isInitialized": true - } - } - } - } - } - } - }, - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "admin_username": { - "type": "string" - }, - "admin_password": { - "type": "string" - } - }, - "required": ["admin_username", "admin_password"] - } - } - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/epm/packages/{pkgkey}": { - "get": { - "summary": "EPM - Packages - Info", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "allOf": [ - { - "properties": { - "response": { - "$ref": "#/components/schemas/PackageInfo" - } - } - }, - { - "properties": { - "status": { - "type": "string", - "enum": ["installed", "not_installed"] - }, - "savedObject": { - "type": "string" - } - }, - "required": ["status", "savedObject"] - } - ] - }, - "examples": { - "example-1": { - "value": { - "response": { - "name": "coredns", - "title": "CoreDNS", - "version": "1.0.1", - "readme": "/package/coredns-1.0.1/docs/README.md", - "description": "CoreDNS logs and metrics integration.\nThe CoreDNS integrations allows to gather logs and metrics from the CoreDNS DNS server to get better insights.\n", - "type": "integration", - "categories": ["logs", "metrics"], - "requirement": { - "kibana": { - "versions": ">6.7.0" - } - }, - "icons": [ - { - "path": "/package/coredns-1.0.1/img/icon.png", - "src": "/img/icon.png", - "size": "1800x1800" - }, - { - "path": "/package/coredns-1.0.1/img/icon.svg", - "src": "/img/icon.svg", - "size": "255x144", - "type": "image/svg+xml" - } - ], - "assets": { - "kibana": { - "dashboard": [ - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "dashboard", - "file": "53aa1f70-443e-11e9-8548-ab7fbe04f038.json", - "path": "coredns-1.0.1/kibana/dashboard/53aa1f70-443e-11e9-8548-ab7fbe04f038.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "dashboard", - "file": "Metricbeat-CoreDNS-Dashboard-ecs.json", - "path": "coredns-1.0.1/kibana/dashboard/Metricbeat-CoreDNS-Dashboard-ecs.json" - } - ], - "visualization": [ - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "277fc650-67a9-11e9-a534-715561d0bf42.json", - "path": "coredns-1.0.1/kibana/visualization/277fc650-67a9-11e9-a534-715561d0bf42.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "27da53f0-53d5-11e9-b466-9be470bbd327-ecs.json", - "path": "coredns-1.0.1/kibana/visualization/27da53f0-53d5-11e9-b466-9be470bbd327-ecs.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "36e08510-53c4-11e9-b466-9be470bbd327-ecs.json", - "path": "coredns-1.0.1/kibana/visualization/36e08510-53c4-11e9-b466-9be470bbd327-ecs.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "3ad75810-4429-11e9-8548-ab7fbe04f038.json", - "path": "coredns-1.0.1/kibana/visualization/3ad75810-4429-11e9-8548-ab7fbe04f038.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "4804eaa0-7315-11e9-b0d0-414c3011ddbb.json", - "path": "coredns-1.0.1/kibana/visualization/4804eaa0-7315-11e9-b0d0-414c3011ddbb.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "57c74300-7308-11e9-b0d0-414c3011ddbb.json", - "path": "coredns-1.0.1/kibana/visualization/57c74300-7308-11e9-b0d0-414c3011ddbb.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "75743f70-443c-11e9-8548-ab7fbe04f038.json", - "path": "coredns-1.0.1/kibana/visualization/75743f70-443c-11e9-8548-ab7fbe04f038.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "86177430-728d-11e9-b0d0-414c3011ddbb.json", - "path": "coredns-1.0.1/kibana/visualization/86177430-728d-11e9-b0d0-414c3011ddbb.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "9dc640e0-4432-11e9-8548-ab7fbe04f038.json", - "path": "coredns-1.0.1/kibana/visualization/9dc640e0-4432-11e9-8548-ab7fbe04f038.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "a19df590-53c4-11e9-b466-9be470bbd327-ecs.json", - "path": "coredns-1.0.1/kibana/visualization/a19df590-53c4-11e9-b466-9be470bbd327-ecs.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "a58345f0-7298-11e9-b0d0-414c3011ddbb.json", - "path": "coredns-1.0.1/kibana/visualization/a58345f0-7298-11e9-b0d0-414c3011ddbb.json" - }, - { - "pkgkey": "coredns-1.0.1", - "service": "kibana", - "type": "visualization", - "file": "cfde7fb0-443d-11e9-8548-ab7fbe04f038.json", - "path": "coredns-1.0.1/kibana/visualization/cfde7fb0-443d-11e9-8548-ab7fbe04f038.json" - } - ] - } - }, - "format_version": "1.0.0", - "data_streams": [ - { - "title": "CoreDNS logs", - "name": "log", - "release": "ga", - "type": "logs", - "ingest_pipeline": "pipeline-entry", - "vars": [ - { - "default": ["/var/log/coredns.log"], - "name": "paths", - "type": "textarea" - }, - { - "default": ["coredns"], - "name": "tags", - "type": "text" - } - ], - "package": "coredns" - }, - { - "title": "CoreDNS stats metrics", - "name": "stats", - "release": "ga", - "type": "metrics", - "vars": [ - { - "default": ["http://localhost:9153"], - "description": "CoreDNS hosts", - "name": "hosts", - "required": true - }, - { - "default": "10s", - "description": "Collection period. Valid values: 10s, 5m, 2h", - "name": "period" - }, - { - "name": "username", - "type": "text" - }, - { - "name": "password", - "type": "password" - } - ], - "package": "coredns" - } - ], - "download": "/epr/coredns/coredns-1.0.1.tar.gz", - "path": "/package/coredns-1.0.1", - "status": "installed", - "savedObject": { - "id": "coredns-1.0.1", - "type": "epm-package", - "updated_at": "2020-02-27T16:25:43.652Z", - "version": "WzU2LDFd", - "attributes": { - "installed": [ - { - "id": "53aa1f70-443e-11e9-8548-ab7fbe04f038", - "type": "dashboard" - }, - { - "id": "Metricbeat-CoreDNS-Dashboard-ecs", - "type": "dashboard" - }, - { - "id": "75743f70-443c-11e9-8548-ab7fbe04f038", - "type": "visualization" - }, - { - "id": "36e08510-53c4-11e9-b466-9be470bbd327-ecs", - "type": "visualization" - }, - { - "id": "277fc650-67a9-11e9-a534-715561d0bf42", - "type": "visualization" - }, - { - "id": "cfde7fb0-443d-11e9-8548-ab7fbe04f038", - "type": "visualization" - }, - { - "id": "a19df590-53c4-11e9-b466-9be470bbd327-ecs", - "type": "visualization" - }, - { - "id": "a58345f0-7298-11e9-b0d0-414c3011ddbb", - "type": "visualization" - }, - { - "id": "9dc640e0-4432-11e9-8548-ab7fbe04f038", - "type": "visualization" - }, - { - "id": "3ad75810-4429-11e9-8548-ab7fbe04f038", - "type": "visualization" - }, - { - "id": "57c74300-7308-11e9-b0d0-414c3011ddbb", - "type": "visualization" - }, - { - "id": "27da53f0-53d5-11e9-b466-9be470bbd327-ecs", - "type": "visualization" - }, - { - "id": "86177430-728d-11e9-b0d0-414c3011ddbb", - "type": "visualization" - }, - { - "id": "4804eaa0-7315-11e9-b0d0-414c3011ddbb", - "type": "visualization" - }, - { - "id": "logs-log-1.0.1-pipeline-plaintext", - "type": "ingest-pipeline" - }, - { - "id": "logs-log-1.0.1-pipeline-json", - "type": "ingest-pipeline" - }, - { - "id": "logs-log-1.0.1", - "type": "ingest-pipeline" - }, - { - "id": "logs-log", - "type": "index-template" - }, - { - "id": "metrics-stats", - "type": "index-template" - } - ] - }, - "references": [] - } - } - } - }, - "required-package": { - "value": { - "response": { - "format_version": "1.0.0", - "name": "endpoint", - "title": "Elastic Endpoint", - "version": "0.3.0", - "readme": "/package/endpoint/0.3.0/docs/README.md", - "license": "basic", - "description": "This is the Elastic Endpoint package.", - "type": "solution", - "categories": ["security"], - "release": "beta", - "requirement": { - "kibana": { - "versions": ">7.4.0" - } - }, - "icons": [ - { - "path": "/package/endpoint/0.3.0/img/logo-endpoint-64-color.svg", - "src": "/img/logo-endpoint-64-color.svg", - "size": "16x16", - "type": "image/svg+xml" - } - ], - "assets": { - "kibana": { - "dashboard": [ - { - "pkgkey": "endpoint-0.3.0", - "service": "kibana", - "type": "dashboard", - "file": "826759f0-7074-11ea-9bc8-6b38f4d29a16.json", - "path": "endpoint-0.3.0/kibana/dashboard/826759f0-7074-11ea-9bc8-6b38f4d29a16.json" - } - ], - "map": [ - { - "pkgkey": "endpoint-0.3.0", - "service": "kibana", - "type": "map", - "file": "a3a3bd10-706b-11ea-9bc8-6b38f4d29a16.json", - "path": "endpoint-0.3.0/kibana/map/a3a3bd10-706b-11ea-9bc8-6b38f4d29a16.json" - } - ], - "visualization": [ - { - "pkgkey": "endpoint-0.3.0", - "service": "kibana", - "type": "visualization", - "file": "1cfceda0-728b-11ea-9bc8-6b38f4d29a16.json", - "path": "endpoint-0.3.0/kibana/visualization/1cfceda0-728b-11ea-9bc8-6b38f4d29a16.json" - }, - { - "pkgkey": "endpoint-0.3.0", - "service": "kibana", - "type": "visualization", - "file": "1e525190-7074-11ea-9bc8-6b38f4d29a16.json", - "path": "endpoint-0.3.0/kibana/visualization/1e525190-7074-11ea-9bc8-6b38f4d29a16.json" - }, - { - "pkgkey": "endpoint-0.3.0", - "service": "kibana", - "type": "visualization", - "file": "55387750-729c-11ea-9bc8-6b38f4d29a16.json", - "path": "endpoint-0.3.0/kibana/visualization/55387750-729c-11ea-9bc8-6b38f4d29a16.json" - }, - { - "pkgkey": "endpoint-0.3.0", - "service": "kibana", - "type": "visualization", - "file": "92b1edc0-706a-11ea-9bc8-6b38f4d29a16.json", - "path": "endpoint-0.3.0/kibana/visualization/92b1edc0-706a-11ea-9bc8-6b38f4d29a16.json" - } - ] - } - }, - "data_streams": [ - { - "id": "endpoint", - "title": "Endpoint Events", - "release": "experimental", - "type": "events", - "package": "endpoint", - "path": "events" - }, - { - "id": "endpoint.metadata", - "title": "Endpoint Metadata", - "release": "experimental", - "type": "metrics", - "package": "endpoint", - "path": "metadata" - }, - { - "id": "endpoint.policy", - "title": "Endpoint Policy Response", - "release": "experimental", - "type": "metrics", - "package": "endpoint", - "path": "policy" - }, - { - "id": "endpoint.telemetry", - "title": "Endpoint Telemetry", - "release": "experimental", - "type": "metrics", - "package": "endpoint", - "path": "telemetry" - } - ], - "packagePolicies": [ - { - "name": "endpoint", - "title": "Endpoint package policy", - "description": "Interact with the endpoint.", - "inputs": null, - "multiple": false - } - ], - "download": "/epr/endpoint/endpoint-0.3.0.tar.gz", - "path": "/package/endpoint/0.3.0", - "latestVersion": "0.3.0", - "removable": false, - "status": "installed", - "savedObject": { - "id": "endpoint", - "type": "epm-packages", - "updated_at": "2020-06-23T21:44:59.319Z", - "version": "Wzk4LDFd", - "attributes": { - "installed": [ - { - "id": "826759f0-7074-11ea-9bc8-6b38f4d29a16", - "type": "dashboard" - }, - { - "id": "1cfceda0-728b-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "1e525190-7074-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "55387750-729c-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "92b1edc0-706a-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "a3a3bd10-706b-11ea-9bc8-6b38f4d29a16", - "type": "map" - }, - { - "id": "events-endpoint", - "type": "index-template" - }, - { - "id": "metrics-endpoint.metadata", - "type": "index-template" - }, - { - "id": "metrics-endpoint.policy", - "type": "index-template" - }, - { - "id": "metrics-endpoint.telemetry", - "type": "index-template" - } - ], - "es_index_patterns": { - "events": "events-endpoint-*", - "metadata": "metrics-endpoint.metadata-*", - "policy": "metrics-endpoint.policy-*", - "telemetry": "metrics-endpoint.telemetry-*" - }, - "name": "endpoint", - "version": "0.3.0", - "internal": false, - "removable": false - }, - "references": [] - } - } - } - } - } - } - } - } - }, - "operationId": "get-epm-package-pkgkey", - "security": [ - { - "basicAuth": [] - } - ] - }, - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "pkgkey", - "in": "path", - "required": true - } - ], - "post": { - "summary": "EPM - Packages - Install", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "response": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": ["id", "type"] - } - } - }, - "required": ["response"] - } - } - } - } - }, - "operationId": "post-epm-install-pkgkey", - "description": "", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - }, - "delete": { - "summary": "EPM - Packages - Delete", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "response": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": ["id", "type"] - } - } - }, - "required": ["response"] - } - } - } - } - }, - "operationId": "post-epm-delete-pkgkey", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/epm/packages": { - "get": { - "summary": "EPM - Packages - List", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SearchResult" - } - }, - "examples": { - "success": { - "value": { - "response": [ - { - "description": "aws Integration", - "download": "/epr/aws/aws-0.0.3.tar.gz", - "icons": [ - { - "path": "/package/aws/0.0.3/img/logo_aws.svg", - "src": "/img/logo_aws.svg", - "title": "logo aws", - "size": "32x32", - "type": "image/svg+xml" - } - ], - "name": "aws", - "path": "/package/aws/0.0.3", - "title": "aws", - "type": "integration", - "version": "0.0.3", - "status": "not_installed" - }, - { - "description": "This is the Elastic Endpoint package.", - "download": "/epr/endpoint/endpoint-0.1.0.tar.gz", - "icons": [ - { - "path": "/package/endpoint/0.1.0/img/logo-endpoint-64-color.svg", - "src": "/img/logo-endpoint-64-color.svg", - "size": "16x16", - "type": "image/svg+xml" - } - ], - "name": "endpoint", - "path": "/package/endpoint/0.1.0", - "title": "Elastic Endpoint", - "type": "solution", - "version": "0.1.0", - "status": "installed", - "savedObject": { - "type": "epm-packages", - "id": "endpoint", - "attributes": { - "installed": [ - { - "id": "826759f0-7074-11ea-9bc8-6b38f4d29a16", - "type": "dashboard" - }, - { - "id": "55387750-729c-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "92b1edc0-706a-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "1cfceda0-728b-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "1e525190-7074-11ea-9bc8-6b38f4d29a16", - "type": "visualization" - }, - { - "id": "a3a3bd10-706b-11ea-9bc8-6b38f4d29a16", - "type": "map" - }, - { - "id": "events-endpoint", - "type": "index-template" - }, - { - "id": "metrics-endpoint", - "type": "index-template" - } - ], - "es_index_patterns": { - "events": "events-endpoint-*", - "metadata": "metrics-endpoint-*" - }, - "name": "endpoint", - "version": "0.1.0", - "internal": false, - "removable": false - }, - "references": [], - "updated_at": "2020-05-15T20:08:11.739Z", - "version": "WzEwOCwxXQ==" - } - }, - { - "description": "The log package should be used to create package policies for all type of logs for which an package doesn't exist yet.\n", - "download": "/epr/log/log-0.9.0.tar.gz", - "icons": [ - { - "path": "/package/log/0.9.0/img/icon.svg", - "src": "/img/icon.svg", - "type": "image/svg+xml" - } - ], - "name": "log", - "path": "/package/log/0.9.0", - "title": "Log Package", - "type": "integration", - "version": "0.9.0", - "status": "not_installed" - }, - { - "description": "This integration contains pretty long documentation.\nIt is used to show the different visualisations inside a documentation to test how we handle it.\nThe integration does not contain any assets except the documentation page.\n", - "download": "/epr/longdocs/longdocs-1.0.4.tar.gz", - "icons": [ - { - "path": "/package/longdocs/1.0.4/img/icon.svg", - "src": "/img/icon.svg", - "type": "image/svg+xml" - } - ], - "name": "longdocs", - "path": "/package/longdocs/1.0.4", - "title": "Long Docs", - "type": "integration", - "version": "1.0.4", - "status": "not_installed" - }, - { - "description": "This is an integration with only the metrics category.\n", - "download": "/epr/metricsonly/metricsonly-2.0.1.tar.gz", - "icons": [ - { - "path": "/package/metricsonly/2.0.1/img/icon.svg", - "src": "/img/icon.svg", - "type": "image/svg+xml" - } - ], - "name": "metricsonly", - "path": "/package/metricsonly/2.0.1", - "title": "Metrics Only", - "type": "integration", - "version": "2.0.1", - "status": "not_installed" - }, - { - "description": "Multiple versions of this integration exist.\n", - "download": "/epr/multiversion/multiversion-1.1.0.tar.gz", - "icons": [ - { - "path": "/package/multiversion/1.1.0/img/icon.svg", - "src": "/img/icon.svg", - "type": "image/svg+xml" - } - ], - "name": "multiversion", - "path": "/package/multiversion/1.1.0", - "title": "Multi Version", - "type": "integration", - "version": "1.1.0", - "status": "not_installed" - }, - { - "description": "MySQL Integration", - "download": "/epr/mysql/mysql-0.1.0.tar.gz", - "icons": [ - { - "path": "/package/mysql/0.1.0/img/logo_mysql.svg", - "src": "/img/logo_mysql.svg", - "title": "logo mysql", - "size": "32x32", - "type": "image/svg+xml" - } - ], - "name": "mysql", - "path": "/package/mysql/0.1.0", - "title": "MySQL", - "type": "integration", - "version": "0.1.0", - "status": "not_installed" - }, - { - "description": "Nginx Integration", - "download": "/epr/nginx/nginx-0.1.0.tar.gz", - "icons": [ - { - "path": "/package/nginx/0.1.0/img/logo_nginx.svg", - "src": "/img/logo_nginx.svg", - "title": "logo nginx", - "size": "32x32", - "type": "image/svg+xml" - } - ], - "name": "nginx", - "path": "/package/nginx/0.1.0", - "title": "Nginx", - "type": "integration", - "version": "0.1.0", - "status": "not_installed" - }, - { - "description": "Redis Integration", - "download": "/epr/redis/redis-0.1.0.tar.gz", - "icons": [ - { - "path": "/package/redis/0.1.0/img/logo_redis.svg", - "src": "/img/logo_redis.svg", - "title": "logo redis", - "size": "32x32", - "type": "image/svg+xml" - } - ], - "name": "redis", - "path": "/package/redis/0.1.0", - "title": "Redis", - "type": "integration", - "version": "0.1.0", - "status": "not_installed" - }, - { - "description": "This package is used for defining all the properties of a package, the possible assets etc. It serves as a reference on all the config options which are possible.\n", - "download": "/epr/reference/reference-1.0.0.tar.gz", - "icons": [ - { - "path": "/package/reference/1.0.0/img/icon.svg", - "src": "/img/icon.svg", - "size": "32x32", - "type": "image/svg+xml" - } - ], - "name": "reference", - "path": "/package/reference/1.0.0", - "title": "Reference package", - "type": "integration", - "version": "1.0.0", - "status": "not_installed" - }, - { - "description": "System Integration", - "download": "/epr/system/system-0.1.0.tar.gz", - "icons": [ - { - "path": "/package/system/0.1.0/img/system.svg", - "src": "/img/system.svg", - "title": "system", - "size": "1000x1000", - "type": "image/svg+xml" - } - ], - "name": "system", - "path": "/package/system/0.1.0", - "title": "System", - "type": "integration", - "version": "0.1.0", - "status": "installed", - "savedObject": { - "type": "epm-packages", - "id": "system", - "attributes": { - "installed": [ - { - "id": "c431f410-f9ac-11e9-90e8-1fb18e796788", - "type": "dashboard" - }, - { - "id": "Metricbeat-system-overview-ecs", - "type": "dashboard" - }, - { - "id": "277876d0-fa2c-11e6-bbd3-29c986c96e5a-ecs", - "type": "dashboard" - }, - { - "id": "0d3f2380-fa78-11e6-ae9b-81e5311e8cab-ecs", - "type": "dashboard" - }, - { - "id": "CPU-slash-Memory-per-container-ecs", - "type": "dashboard" - }, - { - "id": "79ffd6e0-faa0-11e6-947f-177f697178b8-ecs", - "type": "dashboard" - }, - { - "id": "Filebeat-syslog-dashboard-ecs", - "type": "dashboard" - }, - { - "id": "5517a150-f9ce-11e6-8115-a7c18106d86a-ecs", - "type": "dashboard" - }, - { - "id": "9c69cad0-f9b0-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "855899e0-1b1c-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "a30871f0-f98f-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "e121b140-fa78-11e6-a1df-a78bd7504d38-ecs", - "type": "visualization" - }, - { - "id": "f398d2f0-fa77-11e6-ae9b-81e5311e8cab-ecs", - "type": "visualization" - }, - { - "id": "c5e3cf90-4d60-11e7-9a4c-ed99bbcaa42b-ecs", - "type": "visualization" - }, - { - "id": "d3166e80-1b91-11e7-bec4-a5e9ec5cab8b-ecs", - "type": "visualization" - }, - { - "id": "346bb290-fa80-11e6-a1df-a78bd7504d38-ecs", - "type": "visualization" - }, - { - "id": "Container-Block-IO-ecs", - "type": "visualization" - }, - { - "id": "590a60f0-5d87-11e7-8884-1bb4c3b890e4-ecs", - "type": "visualization" - }, - { - "id": "341ffe70-f9ce-11e6-8115-a7c18106d86a-ecs", - "type": "visualization" - }, - { - "id": "System-Navigation-ecs", - "type": "visualization" - }, - { - "id": "089b85d0-1b16-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "99381c80-4d60-11e7-9a4c-ed99bbcaa42b-ecs", - "type": "visualization" - }, - { - "id": "c6f2ffd0-4d17-11e7-a196-69b9a7a020a9-ecs", - "type": "visualization" - }, - { - "id": "d56ee420-fa79-11e6-a1df-a78bd7504d38-ecs", - "type": "visualization" - }, - { - "id": "1aae9140-1b93-11e7-8ada-3df93aab833e-ecs", - "type": "visualization" - }, - { - "id": "e0f001c0-1b18-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "dc589770-fa2b-11e6-bbd3-29c986c96e5a-ecs", - "type": "visualization" - }, - { - "id": "96976150-4d5d-11e7-aa29-87a97a796de6-ecs", - "type": "visualization" - }, - { - "id": "8c071e20-f999-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "d3f51850-f9b6-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "5c7af030-fa2a-11e6-bbd3-29c986c96e5a-ecs", - "type": "visualization" - }, - { - "id": "e6e639e0-f992-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "bfa5e400-1b16-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "7cdb1330-4d1a-11e7-a196-69b9a7a020a9-ecs", - "type": "visualization" - }, - { - "id": "78b74f30-f9cd-11e6-8115-a7c18106d86a-ecs", - "type": "visualization" - }, - { - "id": "Syslog-events-by-hostname-ecs", - "type": "visualization" - }, - { - "id": "3d65d450-a9c3-11e7-af20-67db8aecb295-ecs", - "type": "visualization" - }, - { - "id": "ab2d1e90-1b1a-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "825fdb80-4d1d-11e7-b5f2-2b7c1895bf32-ecs", - "type": "visualization" - }, - { - "id": "26732e20-1b91-11e7-bec4-a5e9ec5cab8b-ecs", - "type": "visualization" - }, - { - "id": "Syslog-hostnames-and-processes-ecs", - "type": "visualization" - }, - { - "id": "522ee670-1b92-11e7-bec4-a5e9ec5cab8b-ecs", - "type": "visualization" - }, - { - "id": "51164310-fa2b-11e6-bbd3-29c986c96e5a-ecs", - "type": "visualization" - }, - { - "id": "bb3a8720-f991-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "Container-Memory-stats-ecs", - "type": "visualization" - }, - { - "id": "5dd15c00-fa78-11e6-ae9b-81e5311e8cab-ecs", - "type": "visualization" - }, - { - "id": "327417e0-8462-11e7-bab8-bd2f0fb42c54-ecs", - "type": "visualization" - }, - { - "id": "d2e80340-4d5c-11e7-aa29-87a97a796de6-ecs", - "type": "visualization" - }, - { - "id": "19e123b0-4d5a-11e7-aee5-fdc812cc3bec-ecs", - "type": "visualization" - }, - { - "id": "3cec3eb0-f9d3-11e6-8a3e-2b904044ea1d-ecs", - "type": "visualization" - }, - { - "id": "2e224660-1b19-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "12667040-fa80-11e6-a1df-a78bd7504d38-ecs", - "type": "visualization" - }, - { - "id": "d16bb400-f9cc-11e6-8115-a7c18106d86a-ecs", - "type": "visualization" - }, - { - "id": "34f97ee0-1b96-11e7-8ada-3df93aab833e-ecs", - "type": "visualization" - }, - { - "id": "fe064790-1b1f-11e7-bec4-a5e9ec5cab8b-ecs", - "type": "visualization" - }, - { - "id": "83e12df0-1b91-11e7-bec4-a5e9ec5cab8b-ecs", - "type": "visualization" - }, - { - "id": "4e4bb1e0-1b1b-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "4b254630-f998-11e9-90e8-1fb18e796788", - "type": "visualization" - }, - { - "id": "6b7b9a40-faa1-11e6-86b1-cd7735ff7e23-ecs", - "type": "visualization" - }, - { - "id": "4d546850-1b15-11e7-b09e-037021c4f8df-ecs", - "type": "visualization" - }, - { - "id": "Container-CPU-usage-ecs", - "type": "visualization" - }, - { - "id": "b6f321e0-fa25-11e6-bbd3-29c986c96e5a-ecs", - "type": "search" - }, - { - "id": "62439dc0-f9c9-11e6-a747-6121780e0414-ecs", - "type": "search" - }, - { - "id": "8030c1b0-fa77-11e6-ae9b-81e5311e8cab-ecs", - "type": "search" - }, - { - "id": "Syslog-system-logs-ecs", - "type": "search" - }, - { - "id": "eb0039f0-fa7f-11e6-a1df-a78bd7504d38-ecs", - "type": "search" - }, - { - "id": "logs-system.auth-0.1.0", - "type": "ingest-pipeline" - }, - { - "id": "logs-system.auth-0.1.0", - "type": "ingest-pipeline" - }, - { - "id": "logs-system.syslog-0.1.0", - "type": "ingest-pipeline" - }, - { - "id": "logs-system.syslog-0.1.0", - "type": "ingest-pipeline" - }, - { - "id": "logs-system.auth", - "type": "index-template" - }, - { - "id": "metrics-system.core", - "type": "index-template" - }, - { - "id": "metrics-system.cpu", - "type": "index-template" - }, - { - "id": "metrics-system.diskio", - "type": "index-template" - }, - { - "id": "metrics-system.entropy", - "type": "index-template" - }, - { - "id": "metrics-system.filesystem", - "type": "index-template" - }, - { - "id": "metrics-system.fsstat", - "type": "index-template" - }, - { - "id": "metrics-system.load", - "type": "index-template" - }, - { - "id": "metrics-system.memory", - "type": "index-template" - }, - { - "id": "metrics-system.network", - "type": "index-template" - }, - { - "id": "metrics-system.network_summary", - "type": "index-template" - }, - { - "id": "metrics-system.process", - "type": "index-template" - }, - { - "id": "metrics-system.process_summary", - "type": "index-template" - }, - { - "id": "metrics-system.raid", - "type": "index-template" - }, - { - "id": "metrics-system.service", - "type": "index-template" - }, - { - "id": "metrics-system.socket", - "type": "index-template" - }, - { - "id": "metrics-system.socket_summary", - "type": "index-template" - }, - { - "id": "logs-system.syslog", - "type": "index-template" - }, - { - "id": "metrics-system.uptime", - "type": "index-template" - }, - { - "id": "metrics-system.users", - "type": "index-template" - } - ], - "es_index_patterns": { - "auth": "logs-system.auth-*", - "core": "metrics-system.core-*", - "cpu": "metrics-system.cpu-*", - "diskio": "metrics-system.diskio-*", - "entropy": "metrics-system.entropy-*", - "filesystem": "metrics-system.filesystem-*", - "fsstat": "metrics-system.fsstat-*", - "load": "metrics-system.load-*", - "memory": "metrics-system.memory-*", - "network": "metrics-system.network-*", - "network_summary": "metrics-system.network_summary-*", - "process": "metrics-system.process-*", - "process_summary": "metrics-system.process_summary-*", - "raid": "metrics-system.raid-*", - "service": "metrics-system.service-*", - "socket": "metrics-system.socket-*", - "socket_summary": "metrics-system.socket_summary-*", - "syslog": "logs-system.syslog-*", - "uptime": "metrics-system.uptime-*", - "users": "metrics-system.users-*" - }, - "name": "system", - "version": "0.1.0", - "internal": false, - "removable": false - }, - "references": [], - "updated_at": "2020-05-15T20:08:08.708Z", - "version": "Wzk4LDFd" - } - }, - { - "description": "This package contains a yaml pipeline.\n", - "download": "/epr/yamlpipeline/yamlpipeline-1.0.0.tar.gz", - "name": "yamlpipeline", - "path": "/package/yamlpipeline/1.0.0", - "title": "Yaml Pipeline package", - "type": "integration", - "version": "1.0.0", - "status": "not_installed" - } - ] - } - } - } - } - } - } - }, - "operationId": "get-epm-list" - }, - "parameters": [] - }, - "/epm/categories": { - "get": { - "summary": "EPM - Categories", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "title": { - "type": "string" - }, - "count": { - "type": "number" - } - }, - "required": ["id", "title", "count"] - } - } - } - } - } - }, - "operationId": "get-epm-categories" - } - }, - "/fleet/agents": { - "get": { - "summary": "Fleet - Agent - List", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "list": { - "type": "array", - "items": { - "type": "object" - } - }, - "total": { - "type": "number" - }, - "page": { - "type": "number" - }, - "perPage": { - "type": "number" - } - }, - "required": ["list", "total", "page", "perPage"] - }, - "examples": { - "example-1": { - "value": { - "list": [ - { - "id": "205661d0-5e53-11ea-ad31-4f31c06bd9a4", - "active": true, - "policy_id": "ae556400-5e39-11ea-8b49-f9747e466f7b", - "type": "PERMANENT", - "enrolled_at": "2020-03-04T20:02:50.605Z", - "user_provided_metadata": { - "dev_agent_version": "0.0.1", - "region": "us-east" - }, - "local_metadata": { - "host": "localhost", - "ip": "127.0.0.1", - "system": "Darwin 18.7.0", - "memory": 34359738368 - }, - "actions": [ - { - "data": "{\"config\":{\"id\":\"ae556400-5e39-11ea-8b49-f9747e466f7b\",\"outputs\":{\"default\":{\"type\":\"elasticsearch\",\"hosts\":[\"http://localhost:9200\"],\"api_key\":\"\",\"api_token\":\"6ckkp3ABz7e_XRqr3LM8:gQuDfUNSRgmY0iziYqP9Hw\"}},\"packagePolicies\":[]}}", - "created_at": "2020-03-04T20:02:56.149Z", - "id": "6a95c00a-d76d-4931-97c3-0bf935272d7d", - "type": "POLICY_CHANGE" - } - ], - "access_api_key_id": "6Mkkp3ABz7e_XRqrzLNJ", - "default_api_key": "6ckkp3ABz7e_XRqr3LM8:gQuDfUNSRgmY0iziYqP9Hw", - "current_error_events": [], - "last_checkin": "2020-03-04T20:03:05.700Z", - "status": "online" - } - ], - "total": 1, - "page": 1, - "perPage": 20 - } - } - } - } - } - } - }, - "operationId": "get-fleet-agents", - "security": [ - { - "basicAuth": [] - } - ] - } - }, - "/fleet/agents/{agentId}": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentId", - "in": "path", - "required": true - } - ], - "get": { - "summary": "Fleet - Agent - Info", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "item": { - "type": "object" - } - }, - "required": ["item"] - } - } - } - } - }, - "operationId": "get-fleet-agents-agentId" - }, - "put": { - "summary": "Fleet - Agent - Update", - "tags": [], - "responses": {}, - "operationId": "put-fleet-agents-agentId", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - }, - "delete": { - "summary": "Fleet - Agent - Delete", - "tags": [], - "responses": {}, - "operationId": "delete-fleet-agents-agentId", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/fleet/agents/{agentId}/events": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentId", - "in": "path", - "required": true - } - ], - "get": { - "summary": "Fleet - Agent - Events", - "tags": [], - "responses": {}, - "operationId": "get-fleet-agents-agentId-events" - } - }, - "/fleet/agents/{agentId}/checkin": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentId", - "in": "path", - "required": true - } - ], - "post": { - "summary": "Fleet - Agent - Check In", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": ["checkin"] - }, - "actions": { - "type": "array", - "items": { - "type": "object", - "properties": { - "agent_id": { - "type": "string" - }, - "data": { - "type": "object" - }, - "id": { - "type": "string" - }, - "created_at": { - "type": "string", - "format": "date-time" - }, - "type": { - "type": "string" - } - }, - "required": ["agent_id", "data", "id", "created_at", "type"] - } - } - } - }, - "examples": { - "success": { - "value": { - "action": "checkin", - "actions": [ - { - "agent_id": "a6f14bd2-1a2a-481c-9212-9494d064ffdf", - "type": "POLICY_CHANGE", - "data": { - "config": { - "id": "2fe89350-a5e0-11ea-a587-5f886c8a849f", - "outputs": { - "default": { - "type": "elasticsearch", - "hosts": ["http://localhost:9200"], - "api_key": "Z-XkgHIBvwtjzIKtSCTh:AejRqdKpQx6z-6dqSI1LHg" - } - }, - "packagePolicies": [ - { - "id": "33d6bd70-a5e0-11ea-a587-5f886c8a849f", - "name": "system-1", - "namespace": "default", - "enabled": true, - "use_output": "default", - "inputs": [ - { - "type": "logs", - "enabled": true, - "streams": [ - { - "id": "logs-system.auth", - "enabled": true, - "dataset": "system.auth", - "paths": ["/var/log/auth.log*", "/var/log/secure*"], - "exclude_files": [".gz$"], - "multiline": { - "pattern": "^\\s", - "match": "after" - }, - "processors": [ - { - "add_locale": null - }, - { - "add_fields": { - "target": "", - "fields": { - "ecs.version": "1.5.0" - } - } - } - ] - }, - { - "id": "logs-system.syslog", - "enabled": true, - "dataset": "system.syslog", - "paths": ["/var/log/messages*", "/var/log/syslog*"], - "exclude_files": [".gz$"], - "multiline": { - "pattern": "^\\s", - "match": "after" - }, - "processors": [ - { - "add_locale": null - }, - { - "add_fields": { - "target": "", - "fields": { - "ecs.version": "1.5.0" - } - } - } - ] - } - ] - }, - { - "type": "system/metrics", - "enabled": true, - "streams": [ - { - "id": "system/metrics-system.core", - "enabled": true, - "dataset": "system.core", - "metricsets": ["core"], - "core.metrics": "percentages" - }, - { - "id": "system/metrics-system.cpu", - "enabled": true, - "dataset": "system.cpu", - "metricsets": ["cpu"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.diskio", - "enabled": true, - "dataset": "system.diskio", - "metricsets": ["diskio"] - }, - { - "id": "system/metrics-system.entropy", - "enabled": true, - "dataset": "system.entropy", - "metricsets": ["entropy"] - }, - { - "id": "system/metrics-system.filesystem", - "enabled": true, - "dataset": "system.filesystem", - "metricsets": ["filesystem"], - "period": "1m", - "processors": [ - { - "drop_event.when.regexp": { - "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" - } - } - ] - }, - { - "id": "system/metrics-system.fsstat", - "enabled": true, - "dataset": "system.fsstat", - "metricsets": ["fsstat"], - "period": "1m", - "processors": [ - { - "drop_event.when.regexp": { - "system.filesystem.mount_point": "^/(sys|cgroup|proc|dev|etc|host|lib|snap)($|/)" - } - } - ] - }, - { - "id": "system/metrics-system.load", - "enabled": true, - "dataset": "system.load", - "metricsets": ["load"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.memory", - "enabled": true, - "dataset": "system.memory", - "metricsets": ["memory"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.network", - "enabled": true, - "dataset": "system.network", - "metricsets": ["network"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.network_summary", - "enabled": true, - "dataset": "system.network_summary", - "metricsets": ["network_summary"] - }, - { - "id": "system/metrics-system.process", - "enabled": true, - "dataset": "system.process", - "metricsets": ["process"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.process_summary", - "enabled": true, - "dataset": "system.process_summary", - "metricsets": ["process_summary"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.raid", - "enabled": true, - "dataset": "system.raid", - "metricsets": ["raid"] - }, - { - "id": "system/metrics-system.service", - "enabled": true, - "dataset": "system.service", - "metricsets": ["service"] - }, - { - "id": "system/metrics-system.socket", - "enabled": true, - "dataset": "system.socket", - "metricsets": ["socket"] - }, - { - "id": "system/metrics-system.socket_summary", - "enabled": true, - "dataset": "system.socket_summary", - "metricsets": ["socket_summary"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "process.include_top_n.by_cpu": 5, - "process.include_top_n.by_memory": 5, - "processes": ".*" - }, - { - "id": "system/metrics-system.uptime", - "enabled": true, - "dataset": "system.uptime", - "metricsets": ["uptime"], - "core.metrics": "percentages", - "cpu.metrics": "percentages,normalized_percentages", - "period": "10s", - "processes": ".*" - }, - { - "id": "system/metrics-system.users", - "enabled": true, - "dataset": "system.users", - "metricsets": ["users"] - } - ] - } - ], - "package": { - "name": "system", - "version": "0.1.0" - } - }, - { - "id": "fdb1fea0-a5f6-11ea-ad52-534e35d3cd6f", - "name": "endpoint-1", - "namespace": "default", - "enabled": true, - "use_output": "default", - "inputs": [], - "package": { - "name": "endpoint", - "version": "0.2.0" - } - }, - { - "id": "2d792280-a5f7-11ea-ad52-534e35d3cd6f", - "name": "endpoint-2", - "namespace": "default", - "enabled": true, - "use_output": "default", - "inputs": [], - "package": { - "name": "endpoint", - "version": "0.2.0" - } - } - ], - "revision": 4, - "settings": { - "monitoring": { - "use_output": "default", - "enabled": true, - "logs": true, - "metrics": true - } - } - } - }, - "id": "51c6ad1e-a9c0-4c70-80da-99a5c51eedaf", - "created_at": "2020-06-04T19:52:24.667Z" - } - ] - } - } - } - } - } - } - }, - "operationId": "post-fleet-agents-agentId-checkin", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ], - "security": [ - { - "Access API Key": [] - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "local_metadata": { - "$ref": "#/components/schemas/AgentMetadata" - }, - "events": { - "type": "array", - "items": { - "$ref": "#/components/schemas/NewAgentEvent" - } - } - } - }, - "examples": { - "stoped to starting": { - "value": { - "events": [ - { - "type": "STATE", - "subtype": "STARTING", - "message": "state changed from STOPPED to STARTING", - "timestamp": "2019-10-01T13:42:54.323Z", - "payload": {}, - "agent_id": "bee40627-8cbd-45df-add9-98c390f9db10" - } - ] - } - }, - "running": { - "value": { - "events": [ - { - "type": "STATE", - "subtype": "RUNNING", - "message": "state changed from STOPPED to RUNNING", - "timestamp": "2020-05-26T20:44:57.480Z", - "payload": { - "random": "data", - "state": "RUNNING", - "previous_state": "STOPPED" - }, - "agent_id": "bee40627-8cbd-45df-add9-98c390f9db10" - } - ] - } - } - } - } - } - } - } - }, - "/fleet/agents/{agentId}/acks": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentId", - "in": "path", - "required": true - } - ], - "post": { - "summary": "Fleet - Agent - Acks", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "action": { - "type": "string", - "enum": ["acks"] - } - }, - "required": ["action"] - }, - "examples": { - "success": { - "value": { - "action": "checkin" - } - } - } - } - } - } - }, - "operationId": "post-fleet-agents-agentId-acks", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": {} - }, - "examples": { - "example-1": { - "value": { - "events": [ - { - "type": "ACTION_RESULT", - "subtype": "CONFIG", - "timestamp": "2019-01-04T14:32:03.36764-05:00", - "action_id": "51c6ad1e-a9c0-4c70-80da-99a5c51eedaf", - "agent_id": "a6f14bd2-1a2a-481c-9212-9494d064ffdf", - "message": "acknowledge" - } - ] - } - } - } - } - } - } - } - }, - "/fleet/agents/enroll": { - "post": { - "summary": "Fleet - Agent - Enroll", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "action": { - "type": "string" - }, - "item": { - "$ref": "#/components/schemas/Agent" - } - } - }, - "examples": { - "success": { - "value": { - "action": "created", - "item": { - "id": "8086fb1a-72ca-4a67-8533-09300c1639fa", - "active": true, - "policy_id": "2fe89350-a5e0-11ea-a587-5f886c8a849f", - "type": "PERMANENT", - "enrolled_at": "2020-06-04T13:03:57.856Z", - "user_provided_metadata": { - "dev_agent_version": "0.0.1", - "region": "us-east" - }, - "local_metadata": { - "host": "localhost", - "ip": "127.0.0.1", - "system": "Darwin 18.7.0", - "memory": 34359738368 - }, - "current_error_events": [], - "access_api_key": "cU9KdWYzSUJ2d3RqeklLdFdnNF86ZW05ZjFrMThUWW1GRW13OHMwRGZvdw==", - "status": "error" - } - } - } - } - } - } - } - }, - "operationId": "post-fleet-agents-enroll", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["PERMANENT", "EPHEMERAL", "TEMPORARY"] - }, - "shared_id": { - "type": "string" - }, - "metadata": { - "type": "object", - "required": ["local", "user_provided"], - "properties": { - "local": { - "$ref": "#/components/schemas/AgentMetadata" - }, - "user_provided": { - "$ref": "#/components/schemas/AgentMetadata" - } - } - } - }, - "required": ["type", "metadata"] - }, - "examples": { - "good": { - "value": { - "type": "PERMANENT", - "metadata": { - "local": { - "host": "localhost", - "ip": "127.0.0.1", - "system": "Darwin 18.7.0", - "memory": 34359738368 - }, - "user_provided": { - "dev_agent_version": "0.0.1", - "region": "us-east" - } - } - } - } - } - } - } - }, - "security": [ - { - "Enrollment API Key": [] - } - ] - } - }, - "/fleet/agents/{agentId}/unenroll": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentId", - "in": "path", - "required": true - } - ], - "post": { - "summary": "Fleet - Agent - Unenroll", - "tags": [], - "responses": {}, - "operationId": "post-fleet-agents-unenroll", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "force": { "type": "boolean" } - } - }, - "examples": { - "example-1": { - "value": { - "force": true - } - } - } - } - } - } - } - }, - "/fleet/agents/{agentId}/upgrade": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "agentId", - "in": "path", - "required": true - } - ], - "post": { - "summary": "Fleet - Agent - Upgrade", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpgradeAgent" - }, - "examples": { - "success": { - "value": {} - } - } - } - } - }, - "400": { - "description": "BAD REQUEST", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpgradeAgent" - }, - "examples": { - "bad request not upgradeable": { - "value": { - "statusCode": 400, - "error": "Bad Request", - "message": "agent d133b07d-5c2b-42f0-8e6b-bbae53bdce88 is not upgradeable" - } - }, - "bad request kibana version": { - "value": { - "statusCode": 400, - "error": "Bad Request", - "message": "cannot upgrade agent to 8.0.0 because it is different than the installed kibana version 7.9.10" - } - }, - "bad request agent unenrolling": { - "value": { - "statusCode": 400, - "error": "Bad Request", - "message": "cannot upgrade an unenrolling or unenrolled agent" - } - } - } - } - } - } - }, - "operationId": "post-fleet-agents-upgrade", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpgradeAgent" - }, - "examples":{ - "version":{ - "value": { - "version": "8.0.0" - } - }, - "version and source_uri":{ - "value": { - "version": "8.0.0", - "source_uri": "http://localhost:8000" - } - } - } - } - } - } - } - }, - "/fleet/agents/bulk_upgrade": { - "post": { - "summary": "Fleet - Agent - Bulk Upgrade", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkUpgradeAgents" - }, - "examples": { - "success": { - "value": {} - } - } - } - } - }, - "400": { - "description": "BAD REQUEST", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpgradeAgent" - }, - "examples": { - "bad request kibana version": { - "value": { - "statusCode": 400, - "error": "Bad Request", - "message": "cannot upgrade agent to 8.0.0 because it is different than the installed kibana version 7.9.10" - } - } - } - } - } - } - }, - "operationId": "post-fleet-agents-bulk-upgrade", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/BulkUpgradeAgents" - }, - "examples":{ - "version":{ - "value": { - "version": "8.0.0" - } - }, - "version and source_uri":{ - "value": { - "version": "8.0.0", - "source_uri": "http://localhost:8000" - } - } - } - } - } - } - } - }, - "/fleet/agent-status": { - "get": { - "summary": "Fleet - Agent - Status for policy", - "tags": [], - "responses": {}, - "operationId": "get-fleet-agent-status", - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "policyId", - "in": "query", - "required": false - } - ] - } - }, - "/fleet/enrollment-api-keys": { - "get": { - "summary": "Enrollment - List", - "tags": [], - "responses": {}, - "operationId": "get-fleet-enrollment-api-keys", - "parameters": [] - }, - "post": { - "summary": "Enrollment - Create", - "tags": [], - "responses": {}, - "operationId": "post-fleet-enrollment-api-keys", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/fleet/enrollment-api-keys/{keyId}": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "keyId", - "in": "path", - "required": true - } - ], - "get": { - "summary": "Enrollment - Info", - "tags": [], - "responses": {}, - "operationId": "get-fleet-enrollment-api-keys-keyId" - }, - "delete": { - "summary": "Enrollment - Delete", - "tags": [], - "responses": {}, - "operationId": "delete-fleet-enrollment-api-keys-keyId", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/setup": { - "post": { - "summary": "Ingest Manager - Setup", - "tags": [], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "isInitialized": { - "type": "boolean" - } - } - }, - "examples": { - "success": { - "value": { - "isInitialized": true - } - } - } - } - } - }, - "500": { - "description": "Internal Server Error", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - }, - "examples": {} - } - } - } - }, - "operationId": "post-setup", - "parameters": [ - { - "$ref": "#/components/parameters/xsrfHeader" - } - ] - } - }, - "/fleet/install/{osType}": { - "parameters": [ - { - "schema": { - "type": "string" - }, - "name": "osType", - "in": "path", - "required": true - } - ], - "get": { - "summary": "Fleet - Get OS install script", - "tags": [], - "responses": {}, - "operationId": "get-fleet-install-osType" - } - } - }, - "components": { - "schemas": { - "AgentPolicy": { - "allOf": [ - { - "$ref": "#/components/schemas/NewAgentPolicy" - }, - { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["active", "inactive"] - }, - "packagePolicies": { - "oneOf": [ - { - "items": { - "type": "string" - } - }, - { - "items": { - "$ref": "#/components/schemas/PackagePolicy" - } - } - ], - "type": "array" - }, - "updated_on": { - "type": "string", - "format": "date-time" - }, - "updated_by": { - "type": "string" - }, - "revision": { - "type": "number" - }, - "agents": { - "type": "number" - } - }, - "required": ["id", "status"] - } - ] - }, - "PackagePolicy": { - "title": "PackagePolicy", - "allOf": [ - { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "revision": { - "type": "number" - }, - "inputs": { - "type": "array", - "items": {} - } - }, - "required": ["id", "revision"] - }, - { - "$ref": "#/components/schemas/NewPackagePolicy" - } - ], - "x-examples": { - "example-1": {} - } - }, - "NewAgentPolicy": { - "title": "NewAgentPolicy", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - }, - "description": { - "type": "string" - } - } - }, - "NewPackagePolicy": { - "title": "NewPackagePolicy", - "type": "object", - "x-examples": { - "example-1": { - "enabled": true, - "title": "This is a nice title for human", - "package": { - "name": "epm/nginx", - "version": "1.7.0" - }, - "namespace": "prod", - "use_output": "long_term_storage", - "inputs": [ - { - "type": "logs", - "streams": [ - { - "enabled": true, - "dataset": "nginx.acccess", - "paths": ["/var/log/nginx/access.log"] - }, - { - "enabled": true, - "dataset": "nginx.error", - "paths": ["/var/log/nginx/error.log"] - } - ] - }, - { - "type": "nginx/metrics", - "streams": [ - { - "id": "id string", - "enabled": true, - "dataset": "nginx.stub_status", - "metricset": "stub_status" - } - ] - } - ] - } - }, - "description": "", - "properties": { - "enabled": { - "type": "boolean" - }, - "package": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "version": { - "type": "string" - }, - "title": { - "type": "string" - } - }, - "required": ["name", "version", "title"] - }, - "namespace": { - "type": "string" - }, - "output_id": { - "type": "string" - }, - "inputs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "processors": { - "type": "array", - "items": { - "type": "string" - } - }, - "streams": { - "type": "array", - "items": {} - }, - "config": { - "type": "object" - }, - "vars": { - "type": "object" - } - }, - "required": ["type", "enabled", "streams"] - } - }, - "policy_id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "description": { - "type": "string" - } - }, - "required": ["output_id", "inputs", "policy_id", "name"] - }, - "PackageInfo": { - "title": "PackageInfo", - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "title": { - "type": "string" - }, - "version": { - "type": "string" - }, - "readme": { - "type": "string" - }, - "description": { - "type": "string" - }, - "type": { - "type": "string" - }, - "categories": { - "type": "array", - "items": { - "type": "string" - } - }, - "requirement": { - "oneOf": [ - { - "properties": { - "kibana": { - "type": "object", - "properties": { - "versions": { - "type": "string" - } - } - } - } - }, - { - "properties": { - "elasticsearch": { - "type": "object", - "properties": { - "versions": { - "type": "string" - } - } - } - } - } - ], - "type": "object" - }, - "screenshots": { - "type": "array", - "items": { - "type": "object", - "properties": { - "src": { - "type": "string" - }, - "path": { - "type": "string" - }, - "title": { - "type": "string" - }, - "size": { - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": ["src", "path"] - } - }, - "icons": { - "type": "array", - "items": { - "type": "string" - } - }, - "assets": { - "type": "array", - "items": { - "type": "string" - } - }, - "internal": { - "type": "boolean" - }, - "format_version": { - "type": "string" - }, - "data_streams": { - "type": "array", - "items": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "name": { - "type": "string" - }, - "release": { - "type": "string" - }, - "ingeset_pipeline": { - "type": "string" - }, - "vars": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "default": { - "type": "string" - } - }, - "required": ["name", "default"] - } - }, - "type": { - "type": "string" - }, - "package": { - "type": "string" - } - }, - "required": ["title", "name", "release", "ingeset_pipeline", "type", "package"] - } - }, - "download": { - "type": "string" - }, - "path": { - "type": "string" - }, - "removable": { - "type": "boolean" - } - }, - "required": [ - "name", - "title", - "version", - "description", - "type", - "categories", - "requirement", - "assets", - "format_version", - "download", - "path" - ] - }, - "SearchResult": { - "title": "SearchResult", - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "download": { - "type": "string" - }, - "icons": { - "type": "string" - }, - "name": { - "type": "string" - }, - "path": { - "type": "string" - }, - "title": { - "type": "string" - }, - "type": { - "type": "string" - }, - "version": { - "type": "string" - }, - "status": { - "type": "string" - }, - "savedObject": { - "type": "object" - } - }, - "required": [ - "description", - "download", - "icons", - "name", - "path", - "title", - "type", - "version", - "status" - ] - }, - "AgentStatus": { - "type": "string", - "title": "AgentStatus", - "enum": ["offline", "error", "online", "inactive", "warning"] - }, - "Agent": { - "title": "Agent", - "type": "object", - "properties": { - "type": { - "$ref": "#/components/schemas/AgentType" - }, - "active": { - "type": "boolean" - }, - "enrolled_at": { - "type": "string" - }, - "unenrolled_at": { - "type": "string" - }, - "unenrollment_started_at": { - "type": "string" - }, - "shared_id": { - "type": "string" - }, - "access_api_key_id": { - "type": "string" - }, - "default_api_key_id": { - "type": "string" - }, - "policy_id": { - "type": "string" - }, - "policy_revision": { - "type": ["number", "null"] - }, - "last_checkin": { - "type": "string" - }, - "user_provided_metadata": { - "$ref": "#/components/schemas/AgentMetadata" - }, - "local_metadata": { - "$ref": "#/components/schemas/AgentMetadata" - }, - "id": { - "type": "string" - }, - "current_error_events": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AgentEvent" - } - }, - "access_api_key": { - "type": "string" - }, - "status": { - "$ref": "#/components/schemas/AgentStatus" - }, - "default_api_key": { - "type": "string" - } - }, - "required": ["type", "active", "enrolled_at", "id", "current_error_events", "status"] - }, - "AgentType": { - "type": "string", - "title": "AgentType", - "enum": ["PERMANENT", "EPHEMERAL", "TEMPORARY"] - }, - "AgentMetadata": { - "title": "AgentMetadata", - "type": "object" - }, - "NewAgentEvent": { - "title": "NewAgentEvent", - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["STATE", "ERROR", "ACTION_RESULT", "ACTION"] - }, - "subtype": { - "type": "string", - "enum": [ - "RUNNING", - "STARTING", - "IN_PROGRESS", - "CONFIG", - "FAILED", - "STOPPING", - "STOPPED", - "DEGRADED", - "DATA_DUMP", - "ACKNOWLEDGED", - "UNKNOWN" - ] - }, - "timestamp": { - "type": "string" - }, - "message": { - "type": "string" - }, - "payload": { - "type": "string" - }, - "agent_id": { - "type": "string" - }, - "policy_id": { - "type": "string" - }, - "stream_id": { - "type": "string" - }, - "action_id": { - "type": "string" - } - }, - "required": ["type", "subtype", "timestamp", "message", "agent_id"] - }, - "AgentEvent": { - "title": "AgentEvent", - "allOf": [ - { - "type": "object", - "properties": { - "id": { - "type": "string" - } - }, - "required": ["id"] - }, - { - "$ref": "#/components/schemas/NewAgentEvent" - } - ] - }, - "AccessApiKey": { - "type": "string", - "title": "AccessApiKey", - "format": "byte" - }, - "EnrollmentApiKey": { - "type": "string", - "title": "EnrollmentApiKey", - "format": "byte" - }, - "UpgradeAgent":{ - "title": "UpgradeAgent", - "oneOf": [ - { - "type": "object", - "properties": { - "version": { - "type": "string" - } - }, - "required": ["version"] - }, - { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "source_uri": { - "type": "string" - } - }, - "required": ["version"] - } - ] - }, - "BulkUpgradeAgents":{ - "title": "BulkUpgradeAgents", - "oneOf": [ - { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "agents":{ - "type": "array", - "items":{ - "type": "string" - } - } - }, - "required": ["version", "agents"] - }, - { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "source_uri": { - "type": "string" - }, - "agents":{ - "type": "array", - "items":{ - "type": "string" - } - } - }, - "required": ["version", "agents"] - }, - { - "type": "object", - "properties": { - "version": { - "type": "string" - }, - "source_uri": { - "type": "string" - }, - "agents":{ - "type": "string" - } - }, - "required": ["version", "agents"] - } - ] - } - }, - - "parameters": { - "pageSizeParam": { - "name": "perPage", - "in": "query", - "description": "The number of items to return", - "required": false, - "schema": { - "type": "integer", - "default": 50 - } - }, - "pageIndexParam": { - "name": "page", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "default": 1 - } - }, - "kueryParam": { - "name": "kuery", - "in": "query", - "required": false, - "schema": { - "type": "string" - } - }, - "xsrfHeader": { - "schema": { - "type": "string" - }, - "in": "header", - "name": "kbn-xsrf", - "required": true - } - }, - "securitySchemes": { - "basicAuth": { - "type": "http", - "scheme": "basic" - }, - "Enrollment API Key": { - "name": "Authorization", - "type": "apiKey", - "in": "header", - "description": "e.g. Authorization: ApiKey base64EnrollmentApiKey" - }, - "Access API Key": { - "name": "Authorization", - "type": "apiKey", - "in": "header", - "description": "e.g. Authorization: ApiKey base64AccessApiKey" - } - } - }, - "security": [ - { - "basicAuth": [] - } - ] -} From f994e17557c242f242b87cdfb5f771353eb20f7a Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 13 Oct 2020 09:01:00 -0400 Subject: [PATCH 33/85] [DOCS] Update ingest node pipelines doc (#79187) --- .../images/ingest-pipeline-processor.png | Bin 196516 -> 189071 bytes .../ingest-pipelines.asciidoc | 46 ++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) mode change 100755 => 100644 docs/management/ingest-pipelines/images/ingest-pipeline-processor.png diff --git a/docs/management/ingest-pipelines/images/ingest-pipeline-processor.png b/docs/management/ingest-pipelines/images/ingest-pipeline-processor.png old mode 100755 new mode 100644 index 8d8b8aa4b42e30c42b2c71aab63bb8f4b7a2099f..2de7449affd0c00dac09f0c8e57b6a7c3b324dd6 GIT binary patch literal 189071 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üMo5v-T?I4AYdo}Fv01XeI%bdH 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%0A!LX%is}>

n(CW&cv0C>tMbgt7k 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�t-10Hn#}Gi4j%)$ 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

*Kd!$vZ&e~l6im%PnxN%4o& zA(8OO9Be)i`kmK$HUrri$F43_ycKPO3GrhZP$?&BcTM?<&U)8%#Yko-GGHBzuZ9lg zyJQ8RXZmk?pnIo+h2k6=&w7zqY$&7+^>iM-N;Z=3aT8Cw%@?DWy_?8Mbw+zy)@SNb($f*l>PtAbg2Rpp*i6<+x^ zYoW=c;JNw5S9;wMuW3vL^>n!+8&u=WV75dyKD#3ASCb_`_ye>DMGHEr zvuz#GCU=c!Ku}useukeb_4z~J5)H?1`vyLH3S&G8>MrM3eSv~sPf9bCn6FIquKP}2 zcu=F^7i%M1TbMuo>D$ON0ht%@nnpFeGp1K2h-?xIH3z&RA;<_B8u^S$&2^$hbbOlt%3p+gT>f?|;2BHY^DrgYv4UTRYN@*_G2@J-uR=w3~o^P(iA( zHpv{Z<)>K0!(=`LJh0UVrJn-R@m)9GsD(#=cyw2!^7g&F8VEWJ1G!92p}>|0Z1PBe z4b>+|%L=!q0!NWFhX_up?m2Uy`zlY>Lu2?X2;6xbq)sgnKtv>$H`yL}KLQ~)u#!6h zU|2bD!x_Uw)NDfeL(*SH1sheL+;uPvv0w%x0>13XK^I2YRtFYaO=;z?88B8Z73J6m z@VN95u2l30x8AV)HE~px!#qWuqacX|m$LH<1_suyLaV&!S6PhN+RwGd(*BSUgdb^3 zp*K5h)xEF@ZmG5PEKIjh7vi4FK;M5Jp=c|DL8r0}b_>EJ=xy{7#9HJds-c}Afvqy5 zjVEu0ElX-T>ew!$G_~MZsd!atnU1%uBO$!uxt*Xb*4Kf9<5u1j zs~kwPi}9IrD)kwu?7z@pUz>L^oT>xT9RzUy2x|Dx6@Qq;V;DBLmoZ*_4`-U0Oh-qHz5Wirdq(iBeIISkX@~XU&s8!w@)+M)0eAU@G zek3QvOzmTVH*b7^V4~$G^vRYI<%nb3j{F&C)|hsN`rNyKp*Unfce0NPQjyX7I@6e$Ka0wz8 zduS4XT)wdcnZ>Pwc-?%>Ns=RJxu5Iu~{}?-Sef$Y}{4ok0+ufc}9hN^V@zHhM!@cgXL zuDkn}NX}#kY)8K*lHo1LBK9zmA@7sg7L$);mB*fbGw>kG&p11iR_AfKaO6QsDi1O@HoFG`Rh1vX)z6Ph244uG8yc>=RkNz_UF?4cuB zHArRppz2{SWa)h?>7wFczxh>x9BBDgH~j39O^)R26RD=K(@uJj-jU_xvJ@+h-oqJU zx!;f@2eE=W!EERU zV7p4oU0=z;bWB zB--MU8jRKi3s(+^Z$iHhyHPL~M@F7?8jorciVf55Jd+C%hirkft{LeYp)d5z3TP^_ z4W1Gm4GFTfh)aa%$j2yBH>^o?%~H8nlXLclIF6=n<9qu}S~W7?sMBpAF4xd*^mZcI z=Z%AMSxGsUJL@;qsgF@#=8vg4b}#T33=R%uqZ^V+s^jN z&e6gn`CEMlbokdv?+x?lM7C>0oMS^fy9!YNbFd2qFGwSXpE~V` z!x{5J{3bh7m@-MXHU=U;Uq!?Y@*Y$KD5^rkib%=mBdI2qix_gan)0g}6q&K&V; z&h3SSdssfs^U4TtujXnM%iPNDhu6xuk5|;K-haaH@N)zkt`(iq;zn`{gR>%sgL0e| z6ji=1*AY{~yy=H%H%Y2J*ar@n_Yl@o(-=ymuWlo;$frQz>P4Ze66Xg;;EO}kf+iov&$Vus*n}S zoQts;Hm=!cK-RIm^jByer+Fp1_0DjF^!I?f-~#ml4?~eg6PMtGZR@_*wgwh{oWSF( zdtQ4{Qq>+`glMQu>!7y>1_hoLpA!oaBLF;U#z%?y> z!9vwE<5nD0CKW=P4V+$`+#5QNrys-H5%MX8GEA3+S1W7n>gYzW&hTSLK4n(G9-{SUZr+uV8^jo&tpx^|K$mz8r1s}77 zP@<4J0RN2{8Q5~Hf51%Jz*c0CODzneoE?MFbJR&`p>B z`Cy+kXE!dQXoQ>Jn>v_+#Q8mdpclIG{TfsL@{4VYPXw?P*qd4~w5Ql5Xx27v^+V=0 zc_VBWSW9?k@t2gX)av2+$M2pwO!#Tonn7AU(Ph0G3^3aUu$iT>+aGf=_>=G>arP%657>IrSR{hNF9w4v9IM59Px5klvj!dv7Dr&V24gxx^}f(0hg{^o z?#*B`Yd#cyDvKi0104J%Ak{L=kyagtxADCJwGIw)AB%^Ji?C>3;U88|;Yss*W+WF` z;Zz2gut{4gm=Mxl*gPEC{IsL&ZH{ftvBlK6cf9xE4gMM7!;w zQMZ*J4>#_uqKni>YSgnNy9*(-ojh!BFI>15n%=q%$aO$+pXr*OI*TDYFNcpC80-gB zA5eby>;20#hMOOLt=UI;L}Oj+&vSPCU}=Y{=R*yfOs2G8c;kVvh$vI9Fes_syejCV z`GpG&c9s=WZDEClMR8>{JF9$Y`8LO_NtsZ{GwV;YIYltEB|r<-NuR8mg1V2|xeY8# z_f^02w~6<&uybgr>bAQ;q9lHwSB@fFiD!P=;hLdR8JA<1;-0=~nI9>A@pT|?;0vxG z@bC$A;fr@OcdB0dU+=Kxg(|Q$DI+T0*=*R0_hmF9M?@|O9iHmGBdm6WVZ#Rvbm^R3 zO%t)01!e4!so0^cy$_{@Dp0SUTwd%AP+iZ9I;en1oD)U)Ni+NGA`3qZ(HEV@z(gwH zB(^#4y|{qciT!pBwTjqqHk@%4i9mDfJke*qeH-TEkE`OZgkoG;v1R*MDnI9G!-`Nn z>%|9}FX;65C_I7tOg*E8=U?bqF736qJI;Aq@o?-@7CfuYfJfR!sSdROoYtiUJYe0GF%Ok zpHmR+pmz+cr5nh{8A5A4 z9r4E$LE`eN?C`*WGjc_qFB*gyO`iCR0?*{nT7EMVLr+WMj&&i7%QsV|&8gRKhTdOD z4;z>v7t1GiP-Mq%w7fVl(!sBLapPjpu66m?u=a!r($q0gG?YGF_4r4FmjVA7@Sp?B zEICuD+>&F*v5)Z~{hLOpjojvUL)X14s#45v)19eUUR@$^wP9h*XpuyJIAWER)zINYEIhkFkVCBZyJR<; zWXnSjZCcHX`%UJD)l%tm1JJP5hI-awM#3V8?j8~vHq6fr)jR&PKRJ-@aTd_ zEj_t#BqDH*L%~ z1g!b#-l1LQ^Z8?=m)^_|530=9pVKX+w-S-aveP{)$nPER)ub>B4?J0EP7uY*cm0dT zUJ_d-GVPT8v%|ERYb!|etqR&oj&A10R|DZ0AIZz1QcAm2$(FsteyciJA8d2zwcd_v zOXJ4HHk)XZ<685h5m)C2_VdmJy9It&@i}X1jwbjs2t>PYz~yBxERS4``P>}2gV2I+ zOnbSW58afMrUE4;_{nFF5O~mC1U9dW;1NSAI+2IxeXBZhhC9KUJk!b4_^7#>PzZHQ z_M%Wpxm#MEL?<0TT6}FuBzsxp>PG&vu!9EZMHUUg;`Q?@R*ZcL9}XV5OO-ws{VkMG~S} ziECnhT`L^CLB{F(J~wQQfZK`$Lt`B}UhbZVJeR@i`ef1N=XsCCYFDT5%8sdB){N-cD;IS*?9TENjM)w0)$n2Dk4FoGqoz zT_Y_?r}z-X`6$AdiPX%sk8pqURcZ+VM))%x>Sq3~Fy}r~d|id_F;|k&AaHdkI&^;O z+LZ3C7d70)kom4wSnDSvmGzVB1k^6BKgR)6CktYjjvyY>i;T(eh8ud2K7PN{n+a;b zs!_?xod?hRg8FM>tgft;jl|zMNIHwC+d7Rgol_^*=qg>znW<7F6W%=~Jl2wFBi^%= z6026e(8Vff_bYoEX6>GGN^>7AbVZ&vM?aER!tzR4a%eq63#yO>kvuu-Ia^ZhF0~$T zQf73Tup}X9!kJM1B`#%i$fVY%;8VCy#98JFuyw3$Z87=4snT78FQe}_=Nt_g?0|Hf zui~`b(vV1(ZD$P~ronCLP|OWo1$@Y*7CFjA3yq@20zzSTM`O{TocH`nqaYz59Goh8 z*n%_sLXfC~*?l?wtD|*$`_|>k;lDBuOtx3~;EadMbz;4<8Uw~AT1ys!YWk^F+hCfo zSDlRu6H&O`dDXup@-PSn4qEjmfnuZ0;ye9>kDs0_EWBBzHypO6B9s~VC_?39#BU%y zbP}W+Iu}#Ah5I6L#8&}(F&`~72`k3LrQ6&|0Jh>BL0dhB37UFz9kt(NX?VAgK7^%L z9itTHMx2+O7^A81qePEr$y&@P?;HnzgwADAa~Urkr&3D`j6J)f(dHixG7%rXZz ze=U6|y<||-Cu)~Y8=mImqx&S(4?XV>w487COvk)w)VF(28|6==sWo2C7(KU3^Z~@O z`dAu?kHNty&LiCLa8BZ=bxGUeuCjcv{1iK4Q?1AC`l9zTjrw57WIpo?k^e`@k;DCE z4e(H1(U%!f%?X4glnQyLqaZ!mSN$w5gQIs_fnMBXe3=qNI;H@<|ELY(W+8 z^7RyL@Ueva(=>nFcVL&Be8nc%SebikkwOzD=T(#2)fp#@)ou04%{@>-0zBiYAI`Pf zs%tkmyxFT8-r*q--3r$^7^F?=w{n#4g?h_Pvnx+&Ny6%9)}GI)(w>LNfiir)MUY4H z)i0g%PU&QlvA!!8ZpR4>VX-TPo4)2~>G}DG)b9NjK5CX6v*k@OSHX4}@Qc^gY!6Cz z2bAp4-m3H}4nNSq5~|ZP{&3_s(*+kG0Fah;fBrQ+uFF<2@6BXRrd>xlRiOU>kVDA0 zd>T*M5Kw3KTp&JGJo1b4$S$);DjtfHlkS}*QC3;2U}fhuL29|}77B{FlGqFsxpW50 zBOIg#uZI=U?rB|E1gnwB!w@#No$P|v(LF9h*vzPgHnoFdA5;H8hjNzF>$Dmj>8nv# z*k?s5bz{a&KmE@I37f`3?ez+H;z>4&0F+lyZth7TzG1}vjU9tw;|RdPI8z)o&;GDi z282(H@7OH%V^}|f0(cU0#ml&E0kZR&u3fOH+BRvNrF>2}Ik?xxCagKT9&`j}zska4 zR0_kKZC|v_#hh^}+1k&UUF-F{RFVrY*xTNYJ7F>*`4Adnh^Vfd>oCHF(-cAey1rMT z^O&!Tq?>?iAX279)FcJ8(;*Q!-7npX4(bYB0p#}kCna|foRwSbhNw=EnGAZ?r8n{5 z)y&ktDj-Tt_(BQ<7v_*uhYfQKI%fdD?278$@O`xPNM?P-{PD~h6?sAcon@vYCI=)O zQ8!3EXa23S(jZ-tWNDb`Zm$y8rL0f@!absA&o}rmp6nE2>gaZ0n#%_wLdRao6BnyY zh!?{5ja1cfW?1oeJ-YKU9sG)%|z0@X2Ee{L~*u%t6>tW2EdqiP`Ok&R0 zYFF2hfE>)64SffJZ4ha;c8)X~CRxRO+C!-|`{{+94_YJf^rdy4 z+vPWJHA>634XYhc`dXO2`mWv&jRgCintem|Tv{=3mR=fWP0_a#8ogsfCm~6e>gPy% zz(MD%@;wfFzEAe_9Xm|IG1G(C+B=B%~i5O2%ea7Fn;Jz`nIDXdim> zFuSbU@%HS?C<@jq*^il1Lt0uM*l1581VTqaU`5$npw50R>F+|{Ks?YTbuOF)O%dG~#f)s~s? zyh^`N6Dn`)`z0HV%o-LEL{K^rCw-OFBnGRMKZX>M=henuxpw#c@#8tKH3Vb^e?zks zDNz*UgQj~wqI76CO|iUMt?I4iXO5jf1-rN!7hb+pyS0W_-(^w&4~xa-?#o^s4yyom zRY7#UgI0$Ip84W3zt96M12}iOW={xhr26WwE6Ez{bbU zD>0Ccd%PC(cdHD{8$9kCUZtKj4)~4~XVaEeVwF&5OV#M>%Qzl23=yAnx&FsO+?y3f z!ClFLs@liw3}TZ{X**6y!#J}_QpknJUVUZhs-5e={0o^^GQ?4kZ~4$Zi8qY?zR(IX za1a4lX69+Ul)8QV!@VNrwon+}@irf`wQ^Gu3h-OMXP3WmxmQFVq(BRGGF&8fkf3F@ zA$=)3CW_BET1(lg4!>g7G+qoBx=n$pxwGBY-isqbTwkbo1%_eDA5o_VAD;QHh-+6Y z*C3foeP9;an=1P192B*?g8$sN;61BpC zgM~67R|84T-_OJR|BPxbUDU9j2%@}v{d_)hI8^T+4LVf@B_Se@8S=*(Vz;Ie>A=k( zud-W-P024#7x${29{Jr;uk|qP=kTva?YG&lalDL?343nHUOgxkt*SSTHz4cJrkRIy z=A)azs7V-#>}K^LtuC2#+@6>jnh1Na5>gg6#6W+nNGW{gaPzwCD11P^6r6H5zc+ub zJc8;;(a0SS4ZW{&p2Rn5l1n-wU!P76G92`t7X?g~>b2qh{sl(ozz%S;I$QRw)MBlp zCLieMbs4$gX^@>9vt;6&C6<#GOWR_wX>pi1*PRcPjmUSP=lR6sz+@wo-u;eIR`d63Rj&r-Yo3=Oa}_$*dV_>M-rM5lGO_Az6MD7-)F{$n$J3!uT@x1B z>3dP~{n=`WfR=}0$i{(4Bi!3N&BZ|?B}d!1%gaMkf}4VmeM-3ZbE-0VkE!W4h*_ya zNBP@!#yi&PzLoN7|*4}3^pN#MtZfSaz1q3@hZzk5Sgb`YOwzANs=mu%+ zq~GqLmlbZCQ#X*=2+^84P3iN*vE&$+4tD{-IKOz74Ggv04o{UXLidcMzzOH7CU$#%Gh-4!cR$>W48t zw$_i?+t-orTFX}vK8-bh8+XdVuHaK7z=C7EHcbVf*6!WA>M6uN)HV0IBw*8l6$Uu` z8%S~{sibG*DvWR&pIrb#9G4}u0w+LBJ1~ai_rCEwET{9lwkm!)D!uU$^#`O6DS;Sm zs)S7s2`Q=_x_qw_khEj}adWu3(jYv_(Q_k3+Hmx^PU%V<8M0;h@w=lo!64Hw^h#G^ zwPe-!Q{%w{((++K$BDtwJkHSWt%AOril|NN)m>pB?^Zmu&DP+>dLV2E8sF_M|I1IW9r~I51x0^DwCYUuEg;> z@7WeqvV*FuYSaY?XoBw=27jDsP{cJgw8@xDYEN>h?|_tOFkii!u+;g!v%>#yr!uI59ZVCimWlvKI|ntGO`=(yhJW9m`}hG2CBo$IVKuDs2z zB(K#{IzDF69ww1)$})#|T|_sv-2@4D=|HPullj)^!nHcmn@%huXm%xyh{$V{sVF3F z9;PEa1m8gl!@8YcI^0fBrm=?kETph*QUHIMHz7_8BZ}=$fgk?GI2{J9$v&b^Rg{i3 zW*DS0L7?y3g}iO~ZqWeYV%BLJw99PwzpTz;eAg8bZPyY30%w-x^g!?j%KRi+ z|Ni@nZN-7d5ew~`xzni`#zDxxcqjhV$U5<~{`o;ooevsLPNbSCfhcvXdn;%Rb3Y%2=3Ry?L1s82Lq$VF8 zO1ME9N+>ufJ;5HGed+fBAd}bC=1;=feFzHj7}3K%6cu$fo(wO^u6Y{~rTSaw4TP0{ z6MP+lge+%^@h)tTOvMi`WA86w`X6wL_(e1QL46OHy<8jvFC&|+DBM_=IXh^?NKAOtckW2I~^{!Y@K%uS%DGy76^Qtn=NJj9TN@b|TyJNk#7Lg7pzwR)>&0{A~P zC*g9Ccl~+VSXBtaEU&!R$jK)A)O^${l*Oj8@KOF4CCjX7jVHL*fsa2U+rAVuBq|#& z9-}sD&=?z&^`D)mt79_3Tal~Snt5BPxq;%?W~CnzadABoaXSg@4rlzxGNP5nie6gx zAJ2V%qr-p_mu;9eP8Hlc-~05MNVWK0ONrfhujemZ3}IK^tD5>gYiXZcL=A%zwr zRRW!Bt7Ofn)%b{z>NP?0>(GSwdAVk#lj@0BjmOzf-1A1?WWK9^zFR_8(^1qIw}^kQ z`GcB23`#1Q_v8lm{fXfA4lBb}%~>i!w|-lIYeBPrb}}d=!a^=vV>Sw1q?ZrHn%h{& zA5c{j+J7_&OfJkvyEK^X5qkv+$mmtlhPmE zI*dFJ2NIlqYsLKDs`koHO3Vsh`z7FN^FLOs4!Q=i- z2${Cu;B9bJ?;7Q6?{vNFj~y(}uQr|N0Lx((LjnIuDr`RcUAEg9kKcoh zAF~3~=ml2a4yyBD?Gk#lo4;(RV#s_?m(Ta|oq2>ubjW51s`gGAr~J3ECKv5NSzD5> zI9*TPzyH-`+u)p?qM)`Ls5OwUSE_7ej5u3mgp0wO+^YY%qQ4Bu&t@~j`~!oEXbF)h z++hk**St=A`C-i*F+^rFL-*SbjVZCECTfy(Pt)UPar6CDa4U`xF1J@0qwMtGMxdjq z1*+&(yBzfCfC!tsnG0<@o_yLP$A&dXSS!0>)i23idGu-j57c&A!uT#VHLGC}hW{9o zU#u#?SjzyNaNcRzb&DO z^-b1_k8H&2!~YShAIb^5y79ZsZs6>(^=F-i{Cn9Y#p?b3!7zYP`8hlHym$Ww&Oj3N z=hx>eBAMd+fxy0a0*_7Xlr+tNu?0D@BxC#x2bq zuPa#gVvQsIw!d0Oep)D?wb-u*8d!iXr!qsEtQ$UCwTk|e)tdc3zxviqH3?ef3O5{= zt#~1D`tM#>{MszAKIfB9M-a<&FCkR;(pO<$)%mUeK}7HW^S0@f;3;L_}>poRK1Qo<#@3_73Z?GCv_y;|{ovF4BD)QS1+N%EPqkr8#esq?Em7os*?dpfyP2kDir*$ znFc@(%9H#@+gOGdex;f>Y>>>7kD#vJKOzHS04A=a7ZUpjTzNDJv z1ezh0VE4DOOGNyGWuUG99kg<_uux37>SZgZ$9ML>yz1eC?ja5(taN#@{7iikdwSH$ z!rB+7HCZ(eN<8!E-xJ(iECb^Em#SLPYvsMei7U!Hs^SM7JbKnUmyy-3xi}}#yziio zjVU+d6`&@^xmMN5$8K-j{}WnkRDTzt+!oeS+fk9qnGXx872sVFjaOYvYKB1<;IJaAnAXNI) z<*)A#=P7e`jtVe&}Ofe zni9vvW5Z`5C#&Y2Mol(-o!UZN9k}zkxpjitn|n07Oh}$ukPmU0sm%M4)2$Tfem(Qc zrox1ON5k$EDzJY~*_-Nt2wPUv5KeVM!WYcrLF!Ja&xa-N5YMm4Mo>>yWzY9_HB4xi zpq;N>w@|V(qny@-U~%ObMqyO#bc&{ku1`dsCgp>VRzms@;RAM`Jou078Nl;FN+$|l zRq2e(f2@D#TXp8$F0-b1VOd0TeZyX~nU0Mo#Lq!RTUpw=D0jTM`W|GrAfdHj`nX2! z#iHy95ogB!E53nI@2E*vv8e$yTKj-Ix?f(o8JhEGuK=H#0vsKnu8TDj*t9y`1ovzs#W;?GF~94`dJNj&46d%8bry~me> zh86!MoXncSeAAj^-(7Mz2%$S;sI4!IMLtLC9m;ltSs%hON3nwgo`Zn-da+_?C9(fc2FC=)=L2g{S|(7) z@BGbOnC&Tdpo*1kw$1G@6Gcmh-{5b@! z2LJ6I3qCC@ACvMFP6`_cQ#2S(t0H^p4#;1gkldd1$Ftowx*^R>L8SL4_b~kP2fj&S z0-odL?5frRnyt2@Ep(VOWY!iu##rFpj1dn}R@btx@izf-U7a;%NId}|)Gs-M{)Tbu zat6bQaL2n~z%ZQNCK>mKSb2}XyzF6_{?dxra{t59!4ZT_Kzb;4xe^fZ0)bj=zMWJz z9W&el1x^FlZ{2)~!BTerycZ}#l0_r~MG9I0@7cjo$-6hYpdW<8SCOT)1OOdOFuila z2_+_dt1FM7zH%)p2fkYpsq3_ZOwa0A>6?9GNh=p)N+agOmXUXcbIS_j1CoRszLZZ=*Z;Ki)J6+E+jD=mw zZr?oaF_k>uO~AJTK7|^3B>5jK*!>$8ya&NC<-VjB%V?XBu}Pr$SaqOosoK5)CWsN1 zjB+oom96)K;#Nn$Sh$ie87f|OH#QIoa0rBs4~M^jC!yL33QL;5n2^UC_d36$ge;ab zkA+JpX;eKn4*ZoGuGsNA^x`HEBtgQaw_V1Uhr++=Md2+LnwTK9tZT!`Kv`D)wxP@6 zM@P7cc2%z00Yi(}Dco4QO~~N#;!LfpcXoj!8E~^~szcL5+3m6O!`m{F^I4V!>PC7; zXz4$q_I;>|UyLJQVVQ^0#ZbJ!et}%RlaI{1)ur81&2stfb4wBTASU&!9Z@!2kVVJR zi6v}V%|Y@uLkjXv(CXYisj8J1%$3`3!yNpE0<#$hEcP-woUP-l{e!#@OyL|J8EviPHf-?$2j$6en zph`(MP~aIAV>le10eAeFIpfVWyt(qdA?M`mAZ(#Kd zDz9(vTvvs{#b^HBU~`WI0UV)ehfsxvU8$^Fg_qeXu}!-RK8pm3TY7_Wtd!v7GEQNh zw^ZfKll?DyE5Q~uIUk)H_3ZL8n1b=|#uj9)+L2T9stEkr`O-xM@((omZwvw|`GA#J ze}Z<(5r*t;I3-x;($C)KSVK&kdhM!wbrdah>;iA1fCHpkdL)2l@w9tbDp$iv3zNAU zTjy{X&-nAzy3GjLvFn_CKg<>nTSaEoK4=?VR~lPqmtf%jh|Pw%ty7cRAn$3AMerR= z@R~>W$tsI$ir9cf0cFAQ_1c|}^0A1qLqOcc@D!(5 zfB?n9lmF|C-elDTaMEKFNI7(0t7IU@$Vbc%m-;d=^P>T$g!#l;iyD3g1_4BCvIu_Rfpd#}cYYzJ&z*jV`}sQ-n`fV88EjFp##ZZ2Ka| zfzIQN9OpX*`SZYuArn+Ozh>Ibx}aJ0Jc$|7l<%y3yA(gO<5_~7UG2r=cUqL}Hh!WRm)*EQ(#Q}J z^)rlsEtHn)DmD<)Us~2#A20pT1yTzOe{Vb}ag=&n#TF=Fq&rl-OoM784IE|#5FxQ?PelC?elO+jqydZA{js_dN};`x4WdMvJ-DY3kw8lddActPas zlHEE5aGY|5wRDCkP~;<&lX?%yPBHl(Kw*cNC5_9XyaM3Tm@->)-z(YgYjR9z$fO&+ zSFU*H-4V7oOviY`>yjTY3?1W8N15PMVTJ!ON!isqu;F zYZr+iOny-!rO`xnggc}03{3zN9?AYpS0Pe=bE@^ofip8vwFl(YFB8<4lZi|q7D#l! z)sEleT#quVWMAAE@)Okoa^N3ibN>TME-p2xPL#38>4=lWEW}%fEXFy8>73PD{;1!W z{y!a2T`?$mZpwHTxEb%VeP~JA4%~_VN7uKl=|!Eq*R1sOQGmokWUYrO z{gqV7f&=fz#3En!03g_tkRdV=MarpDxi{5YfPe8?t@sPnlU%9Z*g$1eP zzcn(qD$W^6x?=R&qyQ!yhqiVN@y~nv$^;h+w3Zw?MQ{O>0(=+#cyM0U^@=0PBx-6G zhB8-~(lbU0o|C2O9xtI?;&ykBOzr||_;qk4B~x7`xp+ui$&IHr7b?g6E01oPr;p|!=Rx@=2zAwlyHW$53DHbT zDqgi|Yj(AB3+a&|g5C?LF~;N&h?#+7oLR+70Nj7wzmA?Rv$?Q&HK%w@$_VydzEYAi zn%Ml#Q-oWmUF|u-g$g;j`03OP3%wAa z_Yb^~v?v{IujS#Dl2YcKv51;jd2D{os%=CESe0F9{a;NYKXD&vD4M5NPC}?3rEGl1 z7ne$Sp0fSMsg=86`_B2sacKS+lB8n@8CJej zr=~!1$l}M8u4)Idg17Qk|lc z-!nitVb0C#oRwmE?Ga#bgkjf;ejtOtXS9+(Mf}c3k7RsE>T#Ns1ixy$+vU{u__|XA zEztVxg}2u{e}D60_XW@04so zT8Ry7IV5yQ)rERSEGhD6caE59}W=FEoFaXyu$Shg&urn5{-z;S1rk#-eZeKrxV-yA3Hv0dgOK3h)P3Y7C#PrSfs9sKap( zg)&LhV%__`>eKDJZG*_*?bNl8GyD+VM@}u8Y91W4K5&8FAY)L?N-f+;^Z#GazWw z=tqpw2(*Y9cZfr zTD;RQIkIlm6Roy@{OMiR)ocVhv;$sDg!;Y{ygX35^Qa}FeXRE0r|mY=A%(`D>><=+ zF{M{zRckK;TjMnF1?`#8^v@C>VZRke(21Gb6F!?x!zTJCreFGyK+3}Hh+eLBWpk&# zSxcazS@VLhTYJp}emE#~#*W&>yOi5nGa!x`)>dl3@ZU68WyBGZ&H!{?=tS11?o0V4 zP24)?z1D>C8V4V_n_eI8>Tf|__eu4nRRL7H%oD?nX30GZyCZ4DbRU9q7|GVC1={Q7 zVGuDnGaz?AM#rjwk+{c}E7!Qdi6ymx#!VrLR9b1O1Ego^+Q%DOQWJ8+n$IS_;p9US zmU6N0v6~wlq#y?sJCx$p{6QmK8{p1gs}8BccpFg(((W*3!c*#*a~E+ka&##{-$qg> z=@R5fq}PFyY!s8x7Xbm2NCf;#1AoSoiODZ^He)}kwa}lLk!hosF#A35xWr!TBZ3va z^KO?^_SVOuu`+gbrwrIX-epU5XlW>Rgfla@+zG=V^z=_#>-B?L+796+^zIVrV8-(s zY4SUdbK6kfb2joXg}CE&qb zod+R1(W>sPH%n=knQ6fl?m3fHRoSg!8v?EZ&s>JDtedKh9FK9%B!Gd5%g_M2S}ioV)|B!~An$jm0jzmIVl9|z~QfVuu^8pdgm!ys>=i={3t zV{BKM1}pSw%tU6#!{(;ypf=Q95t75#oRPbW(~%!%r@viqgrmhB1h+=wi6b+dFaTE& zNT{F1y9bhTVbgbOFH*8`tt>BMOX$Gf=Kf%{_F0DmXcfdWd+HqU@jpGyyx}}Q?d}Sh zj)iV%eQxR9+}Z6N70^o3`jDAbl)i6-?3O0VEhbYWL!QhomO8G^l`dgM*c@NMMfbcI@MZ_+a zAh?qROP8Y<-R9V5M?4 z(2M^;nxNape6J`tN<=Rk?PAAW-GO7dQvpf4sLQqT@%U)e&w}v^7R*sMpO-pn3Mi+NR`q+43;}OXr`0Fw#9Ylw$xxs zYGuuGSt++32UH)ZhiT6Rk< z1lN^5(=UJ6=wgvy{Nw$kE2c)}65hr6SK`i8RPD5Uv;xKlUxQx3Rtd zVodf_wko-?14b7|bA_v{UKL8lWmSy+p$8sXNgpZ4$5R&Dk}Fg+SSos)QulO-6?>BR zm8wPJ>?;?pQqE&X0i&s;WDbt&fhdbj2<2I0t_t2Vjft8F0Ib=STutZkX8Aua;ZMhy3==6ye79)CyI z13Sfh<3g~s`2u@V1~!PgU{da0h{cts1!W1OwUDsTLSEmwS?}l&Wr>fy7N z;_s?dWp6JXmW+K}`F?cPHhs6oJyh24M0TO7D?d>6ZZ|a!oJP8*{WIeJ*_r*PTf7J4 zY4rY?nu-z#Ib)mpU`0o!o@0Z=jr(4tl&3@DTS@FzsLM>2d|Ut2Z?WU{dVuP6<;*fe zj7})m0z|kBzat=p)Fi0P>eHppfE{86X6mj|_1>%+MKk(W%$&q%3=y&WJh$arZURmi?M1aFzNwWKTq z-^|LVym#fR5_*?pR#$OtK$nB>Af#m3Ex&cY44Oz7lhRt)TF<^9ANu_1P!WFhw73|9XL zC0k7=C@Ie2kPM8g$_tHefD6Bk#4N^4)>UPj0elvCU0FGd2N4XITUzthZ@`$n&aHdD zahzFWJEkDGD>xu_jo^TNQ(|Eih&`DF1<&QmhxQIYEH0KkrGGU?VGRO!q&VOBb~l_V z(BPn$@bD7xr09Cjy0_@}cmMwfzBfG%XpN4PTZD^-x3GurUw1w6nr%n&=o~(wMz7r5 zV=bL~CAeCv8G*_auYK{VW4dYz=)3$PSsC&nw-V$VYsM2n{D{94h3!Y ziHu-W3EGN4TK+4q!Us?XIl}G1AuK<;UXQ+f!PvZUsq<+?ZI|?KEAC_*K+!Ge{!Q=BDrtYE+(%iw*<4kx}eVLOH@ftE@$6lxkXkn zyrkc>s%ubfAfm$no25es$#o+Tu&i;P+efQcbgECA<$CUy53^dy@~o?PUxVY3@2o^M zu-g!7a14uo*?j94h&G6zd-4UNKve8NozJz4nEeVzGBz9A8blaQ`#W{r_)#l)%s2_V zSB0f$4yJrMsQdFgau5B3%AR}!61YV&Bt2JC7;tfK<6M38ZwO2K_yaSc$5>#+m3nkRqB+$0u3A=7unSs(4;^u`y}>I8Qf{BekFffj8)-@IF2n$ z0UvtT=2-J$zI|U!;02^DL-%s7rj5Y8@lH}T+E;J6MrdMxTDnVqQz&)J zQD6G*`Jf^fqTW*KQ#+j=ZK4bq+kibjb^xLQNCnqs&A-ctf@~Rx#6J^#Byy*RA07QT zxp+7?jYa>^Tsm^`+Oe>?KTCU&{~%fo`}Y0m2C*=e9cUGwZK{?7Q@RIcK27&C_Sdpf z4%#K7{8I~``uS?|_E$EV=;`0N&{9xsMQSXIVA#+5OvMVdx4+A90rIw>I>D1(EG+f2 zY2L?iyEhB{CUM13-4Vqt4;d1vl_d+rQ2av%#d{-nv9>TDmn>CBy^7RBb`#q|^?T0r zTYyzSODN4j)IFg{{@Y20SrX`UzwfByB}0?u62*Sc7d@B9u8$$_ z4m5+Cnx_k?CR9YJXGmK9l60}(TN|seIUw{(IJKXq)=C=CF%CLhGl@?ko#;3vy5+le z71k;xW?-SNhA^gI!fzqt74BpP@>?6S{LWB}z>O_q#{1iSzWbQcmhNwC+&r%h66B}P z)YLXu3BY5Msmgf`{Z&)zW)9OrcPIf_izc1OjR-wfJ%6BtTKO9gc>@J(&KgW2+q(hY zho^2gYY}6-*jJgJL1!Y?%eb}tc=ugI@2X;1wWs5STDwP=la$2kT|TDX^3j%Y?JI&_ zKn0oRpVpw}1JfPF2+z+{^KR2uYU{@Hh5AGtq7u{@=P<$j>fMaj-NJG9=1S5peTH}k zyUTn-$6r+84c21^;zkw8%}KDpoSd>(4*kR@eIAv|GbNL3`VnT0b@~-An1pn!hrsbs zLj7Hz+R=Uk`X%d}5^Q4-#Ku|?vJ>K~w3LPzDCn!75PPreD?jc<_48_^oo4Q}N?6vt zxiq3;q;y%F`?jlO^vgvXlvk=}WracXMrl=Qm(>K`Z@Lf5_iEAAf>RCW7p6+0sYYZZ z_T+E;&+i&`IR=yKjt08Hi(n{lQ$D*Er$;=eVSm$GD!UNW@dO4H#x;)0e!340bg3o8 zyTftpoMcPuG*U-omRJmRTF#lI(5z1FVta&qQ8l?|Rm;?B1XJI_R1PYQqihZzYoBh@g<*Xvf4udTgsnyR47+xgSm;u6O$fb;Ovin9#Yz$~5k;9E8j zs`I%YLj{}j^FxO^JIx5z7S~nwsN?)ZzV}thHMc9qmCR0rXkN~@{Qfb~#oXLdS=c04 zN2WT0qOFMvLB$Fcln2!CYbK<|erT{?Qc{PNi;e-fOaUI%8VILJz7Z`Xf-+Z$|LzW`VkLZm>}$JP~9 zk2YsD`eHfreVOMf38$W|_fP5gz(x8)1~Ap>k&3scU&aaT#cUwNp|uUJ6mb1%%(xRv zhnSUrhBH6e#$h^&(uQF$eTsbLcbMA;Vah8An71~M2ghbDh$ zkAXx(m3V)n_xv@s?t9@(f2-#CjDcVWLnP4L^ozOpmvqmc0peNFYpCgO_Z3ppuj5Z;@sCDYMY?1yjU6FhHE@TGNVvSlpHv4U*{UMLoh zA&rE25;7r~^lg({b_y!-{9x3qbraFR3^L6+Yd9P)EwCbMo(6|PD^^y)zJGk-*(E^l z9;LKr5LZ15s?M=pmVRy2IeeAPDyVW5dPX|M8ZbNl-N#{%B)46>vs=*7n>NsrZPTSj*@jTiL+@6$4ej-vZi0PDG>PETujDbahd|` z8_e|l`+K&`l)JntJ8x;}&MkXNjAvyvbWFD@Udbuqq_jXMS%$2~($%okS@N(V20J-l z)lJq+acL4mC@Sj&pTSA8K2kzOk*V z&2PweR~s|%IJez@{Gq^#_WSfaE2qj|a6P{O%UC%C;Prp?LIY_1@Qd00;?3t@w-Q72 zm50e$I{|=Ft}L^*tEq;|e7s+Gqj+d@_T1sc`A1nbrC%>Z;QZo^(mR?TsppM`A*6j3 zHF(eVe=RJ6#w9FoHBu=$Eh=&*fVVO={jr-IcnW%{wf1IzLoKpA@k?~o+oOVJJ%Mg5R+jR75z{;?)>Ef)6?LLX!Xhqp$^SJ}?LT`_x22GJvmke*|_;2Am*eoZ5ORwLQlu@1f zkdB!)reRz+{nO7?qRarnvdqm!XXn&^lw*^zf!`Z{Gg4`pD5=qty`!=G)TUA8i^F;+ zuar>M%z#2nsnb;WqVSjCR579c5Qxlt=P-qbX}Yv;cH--n-KLS58uVgx|6Rx6NX~Tb`Av zxN{vquhT=B8Xa^kH-9NoHKUy|tP%Zuz}i3MUdKj+GCl3esPZ9S$EvISs*Sc|f|0@_ z+dgoT;LN3lQOCY)#OIrlj zd2Y#3t_)k8J9ZrB=wzjWu&Bam4oe3g>0v zY!Zjo42}tWQ`a6#NIuiLT$_9~&_9#0%zBR#)W*UuM;;wXn+VWlWSBP*UaJ({t`*k_ zmM!5xf)JkwqmYeF^C)DUZ+C=sNwDzSMy~_P+hRh13Y;*Bs5Spk$W1+CS_RO@CU03k zpLWv!W3P)j#NNH&4Qz0+zgF$_%NrNUtztt%Zlecgf)@G=a{H>-A)YUN7&CU=kwT{@ zp~M<|2IS7SVY~}^4;uPY_U8da(T`tah=e5a*%t1Zql_cds6@tt{| z*=3cMgxgH?T`QTMlo~`vrD$L63x0sa1)JGy<5usPkckbz7_*_UZDX7OnLK3}P0H~D zAL!>_jb}vGc>YzpP1e*+G-$OS?W#?d)gm4}ebZOrGHs>7X8qx6Z-+uh?B-fiMng{S zO7p#aUjw@bQT9%NJ$}n7aTlfgsU+Rx9#$BBCQNGB<=qN^QmNm-)G+9sDj*{fo2ESy zn$#Rz%zk0A^Kk}aQGsDKak#x5=VTPys1LFCNCr%z(S-&L47{aQ&rkFK@;*f z?!#0-f}zf!{K?(BvufdFi)UOp5aq1D!#jvX)e;@3Ca&N+ZJIP>a&+HLH=Gx{EVE7f z4~0Gs|3wd&tS;rOz2SRpNqHJcN%46l&owPlh|DXBt#3)fa~`9PtF}~K46v^`Qq$M> zk{L>X&^)7m4C~4?4C<;4Ww+p1P%5FdeOT_R zbZJP+2Zn6jjDO6`a(ih}Zc7=P!qY%e&pd8_%=$9T=XMd(0u!tf9P5VP3%y^3i==YJ zfKH6n%75X%f=Mehug(Xc@(zH43-j_dNGdor7OWacDRT-SvYn3&dH~MsjZ)SQ2tx?~8M5gG?I4 z#BS?f1{VOr29qS@K3ROxOy6FmnSE{MemN?7c8}UIQcd#h4u#x#aG|32u3Wk$j z*Oskih$?ieXoo{Ow~nv^wzBW_S>ZnUqZAf=<`(m{i81TxJ47XZzMWZ7|s+2rIkf z7sK=N4ZqHU`G!2K!OMOHsc~&`B0jxO0DSi4%p;@so@i@4nm2hbp zGaP)-iGoTY(d@?*?w?968TJi#N3B>fGo}*}CQ}6o`$z5x3?=GX+AaJdli@!a+!L_c(~`ItCv^iC40r!9AclI zoq%67W5@L$tcyuy@v<}HwafMsfSIjs)n1nv9=M`Hcg!p{4i_Dy5N6G94R4rgfDd>Z zBNhemTk=KwripkLO41a7%;Xs(y})ji?kN~ArsL@;rFM>F51s-HqS?c=^(mxMpwyn_ z4;^9Kugm3VDD|ln?IF#uVeAC`GO_uI{t^AG1=@*hs-8ciXnRRC7(Bg2Po#`})~GaN ztFC*8%Pd~B&2G&0GnT1?!j=T~OI+wxt>M(Ur_}x!(uT9<-iM(JsyXksQa5Ze)(z2w zJ9808Y*P;V9h0$i=d!DhX|l_lEpx-}rm*N#7f;3=wfUrs$|*-Ij>bGrZA^_^AH5k5 zdhrr7!wK}{Nf)tgoz`<6gB#0g{Z)I)TTvc_jZ|+V!VN3?&nC%nu3`!4k!OkmUlL2N zll_fCjhC)Pu83&kvPBKQ8}6(Mt&OZ&z6{l+vR=dUB9gJ%gy;b)%at&;reEHLYu=zb z;I^0+yHK^I7g4k<>mQoYK$Bi9Ao2813VISqK||FTpipV`Pw1+TUE%NW&jHB|N6h=T z+I{0?yRFsB%ER^dEca~u%ED+LRU~a}ea$=WyJGrac{0c(Vi{FmB$joC{cq=#W0o7$IJ$h(wkvBN+=y}gw zl=M@o_1f6$(Eia&&|X8z;nAD75|*8%ta&qbh3_NFx7Bgfy8R|Kh+32KF{J{%nCBG- zO8W!JKLmq&W%YI%`7Rnf5tEyKB~cU*@?Y<5Y-&j98+%m3D@ z1lL`g+viL$XUR_xt7sO##VWOi6Q(?fvJB2VP=lv$L`upka~5!C=pe6xt3=)TQ8l2@ z@a?Xa@QOBR3bu_D`Zl_0?{oSSQLo^cLHt$vsq14?=}K9X>7NgQ1W3|dc#&kd*PIQs zqwwvk^GT>>FWUrx-$b(VU?u)C<(nnRfLaY5C0L0;k@=K{y)Ay?XonDF@5WAI7DQI- zHOepfbAcTOO@Z~*TYyg%4(8XMw8P!ELNjMssht8rb0}t*AbycrKZ6qq^+@W17BuCE z%6;bz=+@ks>C+SI^jKHuNYFcR=Y5~I89nhuPr9qkKum|vKuE`2$KYZfkCB3+0r&xz zR2rJX^H2e1?QQ*DQezbieKP=@o~F|+ZEgaAGkH3HSGtrpATTq%PKK3v2+r*|E$D{M z0fnov`x`RjL&mWAuKWAQE1#Y<$UP;qnmzy_o-wm8dSC{9bztS?3GE+Ysqrh!?5tFF z50GvpYt^csM3=gy^`iA|zJx!ZR-><{epcf4Ea`psJ^RH62@M$ZQB?uzp!3(k- zC27m1+*EpoLqb-@HhpMFDP2ZTMfKo_TPpS=LM3~6=aB>xiB8Hcph0~X+J8;xu{n_u z?B-`wjtp;X{qgR0YBl3kP5B3#x-;LQ5b9SlL!F~^2>gdvY7kyfA{6UyUnyTM+&;Cw zOyNd3)_^P8v_1#>!zg*iF0`h z(Urs}h}|F4g}nrViR6vC9jessYXhUMPu&;2s06DHf+z{m*5v17BSa8g*VmdY&(WJ<*Y5^8u!V}IfXa`()UHM^4U|^!2slDx4Dp1;& zS?RrRcJ&2rs;FGsena2@Yy6s~TAn{}q!fb@D=Z+h(m3R1fGT!R)pg^Z7W=^T1>{Pk ztnn>HWCa-J9670rS!0#{f;02XQ0~l>GKlgGxfCrVha_0!Q9M_p zD+adQOwlWBm&H`N$-`jdZCuCMGm3cXsQL@ax9+|31dH=o-+!dUvAeDshfrtfI-y5K z%Pn=WH|#83vAwFyp5^Ri6DEIk_N>_|kHjG5&N3=nZoG7O(>z{4BwbQR(BMdaZoL%xF;k}Y4!>e@k6{&7&u<;N%A zFFwtT$3PGC9||f3S^&E%BgSltYnT%v`B)rtcZk0Xnu(VI^1+uFJSn>6(fF?UUSRY` zORz0NKyGmmt{2Z-{v3{$1W^H90QFj{AJMj&UoEa@ZPjvDAe3V&tv&*E%G&9GGByECjx33ZO4NT_w9fSlyLk?LLEL}%V+9cR6^sXe$gs5!9tp^?8LQ4-fx!X6uS0ol z7NJn2^nv7oqacUL07DO^0D`Ogkq@-j8UNu`nQA?-7fqtVjb5ofu{C6#SS>8uAU}}W zbg(QXUA{jcYH(X|0jSY^;5ynSA8Z1`ITRw>T?a?~qD6CqaW$HJMhyxQD5v?^o7H$X zkabPoZq((z%njCogOxBE6mw75Y@$zrm^V{XR%NaMx#?CAXaB&yZ|u@EU>~+ZgdOE! zQi`o4C@KBE`FYzG@))DS)M8+l$3;LU-258Gvlape4Xku3%AsPMD^_xQ?afT>CL zpVVQa?4V#|W|lqmgTFYMdvR*t3ntZ;KxJ6#8A34 zuioM%llxjzRDaH@Ry>;`tS&0`o&Kmp>hSMBu_WI9HBs1VQ5-<;yr59Ha7=O~y@Z+z z%FAiAcm(D7XH^>kgO~Urq5+`IU?i5Ep0~#eD6QIB)^)I12Kf0wRFGflBDY9NZ&z#v z-6cJGD=FPJhBZ00F|~Mr>dB^uR-`P_%RkmkgJn)01cmCUdy-F@7G6z9FLT;}5zcPl zZIf+78IVXu6-*df{)c_T^mJd+s`rx8RTkcgK;MBmVY8s4xY`*|p)6&oj;6|^6#OA9 zTmBL0Wm8wNxw=P~6or9*U1wAHk^@qA?%q3n%BC1FY?+t%ykUpbQQae;Kzj~!J=Nrh z2~xVtaN9h7i=%J+)pZzN%;h>t)RUQjE_3^2dXP_8st(_V8Ge+e0k?r}LimOh7&fp0 z{*ae{^t@8CM%tF$lR(yd*>R+UHd2v7LkVF`y~R@XYzNaII{qqva}mAsY{7Kk z1@?m#r=@nHsnW+jTm5jrci8A7N5QUjf&Acc|4O#Ed7cU~V~@Nky3oY>VUpD>t0lZW zdvu1gK}4u>o1$?W|1*C61|hfy*H^x(g#&~dz{HS0t48a9$`{bP_mxRa1w@51=ED_G=tM zd$ECh>*_;{@@k&+zG}KbBbod7mNF8_a#grkGRriKGrfLi zF!Dn6(W`x`xl@`YZBEUto0Q1@OAGBzxrszCwHM_W-JhTlDiqKR`D-~30Fj#@V`lja zf44*_d7zCqp!JAcyc?rI(E>O?@Wi&E2_W3d+ij6@g_}j$IWtKoCJ3;2s4bC_|Y@5zZx$~){1V}D=vL1G0r| zx~3M$VPeHWtO^4n^lwDMV6)JI5lXy%d3&?xHWL38HjR5XdTycrgUDb-6O4=BQ5B4& zsWSXqm;2NM`Ji>{LRE~;8(35kzf3#~ zGRWj+?UZ@=Zfi0j;!~)RZ%AcOa3{qgli5EeY!X@v$dU= z3*Aq@oKI+HV7T_}CHguJYOql%OGU1K7nF*~Ke`0xyF}u~^Uf zJXX1PA_o4F)IY5xSZug}2U9-mDV+8oOtz(()W*twCtV^y>j9?y=^f3Vagzg-zHU;W8Ed8qagr`9;7kK2+V21w!zU zLS|c8KakqM7kZStH^rWzzt{tyup47m zL(g-FX*bMP+AyItynBNZNTm?Fo6sp%(%@ehE>BOaYHZXKC2@58raNr9Xby#CQxCgw zI)E(aSEt?pRJ>i#o$HcmQ~I~>C~3bt5EbG;6_^y3g@gt0?|R&GFk4yhcZ;1w3Yq*K z-!|mwemm&PAq$FAx07_G-y`Qe#G6}0YKcoyU$n+KnliDzq`S#)-MsS@4+07rKrfs9 zzp(D*EHN~28jdo&8v@(P^riX7e`xiMH>>C+OsgDJ9XP~2tfputXOcRwtD`ML zrT9m)wpkPv95ArR9fQ!H9{ap_lgyfGludQgFrG@Zme4kCbe4j3Z6NPq+Mvbhh` zBvKbU^>xlrK-*_PN>q9RKu`Q4bz`82cXM*S)H!*KgF=SLAMXc!dYJ`H$uxgXW&nD* z7t2ulE+os8dp#OS67Q)+XGt&g1m%$fFnDZw)IvX7gB}`u*$@}2_r_Ub`#Z}b)JgwLs1x^P1nmvw5|JLz9}t{TW7PssC#$W# zlK)B)R^V(epr@Zva^!DACB~zog!J6*<0)PDcCRNt5O1=b(xqmyLv{AH%vOJcW87qG5rSGA41+p$0sqf z$)btv$r>s1p8-rv?YD2;m+GX>;aQnPFEB*WGW5=3;}Ujb6iHWxP4f^YF+JLr$7~UL zfm{o*bNWoAvTnugdbS}&bZ*}@lK#o2jX{#9J&-FO2NwY|s%>4Vx8vl@dyxeT-^`8I08?xS3sg(FBO{ zgN>0PVCB;zZx4YtKAT4}203c1pKu}sdJHDbd5W#pU2g>r) zqp)r;NSwZ>`01z+;9*ZQSys83Ta;W|tGFfExTZW4?9-b&)X#B!ioD5?-jV27&zo=6{-ciF`Sy1$-?{Mca9ZL- zT7;$s$Qnou+w7WXJ0U|TZbp6^fB^Q1Xk$)xS!_wRNc6988^2&fE*E_cbo|I3)A&>t zM^2jP`=X_KIQ*5Ie6O^`Ju~5dLzczaZD2Qwr-%~9 zjan?YHstPseT zZikh9Gl!H8zanjNs17~C=n$m+nSyWlS2A`fs1^-ESm~v5U$>>PZ3qC;ICM_{9{0mG z5#uFulC3S^m>mEg;4dXxplj3T&nW85$<=8WJqxm^1If23Jr&MavBR^3FH7Lw0lJa; zDJ>I8$*ep7=Tb|gbXJB^Y;is=NZ%;G66c~1aQT3L;S8M28U|qSp1%}1fr4x6n(qRT z>DW+$^dm~*j?I5d<2vkHd!;4=_2x|AN%3F0s*6$ow8{S@ckqS5-7{{WiV=z#9>kz)zJtsM#U*K_at zzCA&UMBOj32Rf!B1G@WkWNgp>`oWth>3zEux^hX0Lh-Iwf*Zs(uO0pJS0Z%lh1!k= zxZqy8Dr(|D>KRlLFn>ese>`CiUROcRbWCNTu?-c{t>5|7@Z_iedY6>@H&GBUG$!v78thQYAU+M>c z&Q$uffRDC+&?2$)A0?TMg&YryjE;S)!9LX>AcKz?ou%Q?hc=zgqHix&@faZWJs-?64 z`^KwNFIb_=I3W_wp7`;7Z?Sjctzga2_!4t}b)a#Ni3wG*pq znDoxJcalH{$Eu3Knx3k&+W<=>o@ikd;;0q&x7?n}KPp>4X~6*L_b2an*=3C-G5Bjp z-~ac`4*ewz`0u?jvl=r0pSy2IE@^`(r|tm?v_jRvX44lzaVbrY<5CmdXl~zrnXel8 zwT=J*&^;E;W4Al;tdQhwwe)7#Foq|Y<~CaZ>QESDe)o0-7XjSrW^#GplkDBb(2E;af z$9?ZD00$WmYu)@`BFgBPm76FmJVP{?wV^U(n5>rUeLLtd7(W#&Dj(#0&fiVk|9@S# z7hRYYyprio4f*z*t(LqRV0iCc`D5&|wOi=27CigUjrFfCPml~BP`53C;kHYv+J-D5 z+;N*DM5KIHJx}UP5Rk~psw+hqsQrf{rgZ@?2yFTi1XWrrTxDSytah<8{rw@qy@RD4 z8D@3QpS0L+ZvPL7;Q%v-NQU<2=jqlb-XHQmdh(b>M+PwEJ-1CGk)ddXVRdVGcZCfDQl1zOGSGy7$|!R)v2x@4mbD>$m?L7xyb> zc-Q670GHbT35bI_sXKi~ClEj8>Q3zB9)4Xsetg4!h#%kC$5#jG-|exy_$>9rk&7nJ z2ahzh1~%v?aQ6FMwhtEjAJ?1$#Z+)FulmYWQv_#(Dphl(_qru_`6`~Nft}s>r^R0z z6+6x~%`AUtRs+&$b%t7Vv!e65zeQw~*F@Y)PCz?s5dqL*nW*{OuLI%l{2JHsS*C$K zQ!NTKk-_KJH-Bn#`JX=pu`_q9XRpQyfLyc0-$Lqye;K!ZXlBK`oa3b~{R`v1<0bn4 z9CyF}@1}sGxq(_443`*U$b4G&x3aDMS`QOBW7qUs0kBivzPSp_g>Y%b>#E-VbbE2A zRi+)f#uTo#Q~KeIa)gQR_?3Gnmc3%HqO~urE^C)wnj-M&B>o=Qz}mZJ6Y+sjGRS6! zy&=_?$AXqCw@YYP)h&(5qjpQQeiQ$B4h|2Z*62((d{=={ql{Ys$mXL(IuN_Gm%#*! z$@;6p)W7{LOkKSOPW&!9h;maaWseNJ&vvf=km}37c=CU)4O~imA7BZe^6pf*GdliR z8{M^Q1I!I8s_C;po299O&ovz0_dh?#rT#$YdbUKVULp|AuUWLU{sZuZZXNa~0j@L3 z!RY@H_nvW0rO*4Y9Z?Y#5s@ZJQ4kQ29zaD!sjKuFl_rFMlmtSH6;u?I7U|ePS|TO% zqM#r(6d|;Lln@|<7CI#S@9eI-?0)z6ynT2P@#8V)oV(4;HP>9D58wWOJ{p}XtvPNc zpfiE+|M9NjgDWKeS3say!}G!VYOiNEdZwtT$nWaiF&j_=Q-ANT$^Nr(D6kj&SJ3+i zFlyY$Ol#y^{|u+YOpELs^T{kIuoCIccfkDUP?A0V%f`5Ewj4s$UM6fB&vYe3r8O+v zc80LujeGb%s?l}yz-tv+_0C*s+bh|$C?A^9 z=>Ngw#VFpkvc4x(LvsljAE5Xqfx%gGVYmcyr$5UU`*yQL9(m7RX5D^sys^bMXx9xg z$`$$axuusSb79Rx1x3waf67yAt%L(vHT!MD=(d!u=WyG(MWN>0W@^EY!u^L;s`4M` zu!?qyr8R{r#a=X_>%Og>9$k3E;Y2pL?UtP6gSw2L1VuSlp2wYHIRvsodeI)kX${Xz z_(YU&PqrGdp5q_B>OG3n@g`JK0#sPu$2b1Ka#gv#v+Js^qRnn4TqWeEq^JqU#>Wde zAJW|GpTqk>&uq(ycz&KF9^)T%LtILY2n!0Yn10hnNX`hY0tQL*p!?~CJ~c3*RQ`Wz&)$nuEbY$T{Vc|~pI9aSf$ z9Oc>r`+!K?o>>SD>F!*)Btq8p_+Ynvcw*Jj!b7af8dFUaj9q#w|BO6T3p!yWIbndKB@oN4V&vNP5Zzh3$0Tn??AS{iQ zgEenUPlx|Z`aK-2*tW@(?Bd^^4)+Jmom}UNPqr8M)mP_V1nrrAY-5!xPZsgF+L5mS z;#c4ErX$l&M2hE*o49>*s7rhgxmGW!L>uUp!Qmq55+i!%Wvn`LkSV!pjdTvLJrZeg z`@w|P*6@+_#7j?`&rG#Fv!UDx#}~X?!}Gq1a1U$hSLDlDFxo58b^c}CH=mn|8zxtQD8wA2NQ^I+sG*!TJ2Rf0}V2` zXgo!W?C2UpLP)s8kBq%I1(Kv%yJR$lAI22dAE#D6+<@GwBAYmA=^ZB>$+vR3qv8GS z8dp6mblC?}8b<`gd7B4|ajW9Fb>e046`w3JLP%=^a@tC!pVp$Ik@?;-2=JH}VP2D# zKCBHyvXjYli-LD5dKc?18R;F@bZ%GiS}$NU_IkCt@hz%7Mdf~>7T6!g@A%nsjQM@x zYVlo}x_rd+)UoMquxr8-MW(}#x--_kOBRR6TCB{GI4kQ)A8KC%=+7?2-@SxQGy9Va z^c1XFPy_YLiR^U^f3^NbM)sG*ghU>_lu2)CV~w6shkht>HI=eJe{aM}{Pu2OH6|bKXW~f?Af_v?DKFJn^&l>!Pr9y3Ryb8+GmGkfU z%U4rg%#_u8S7O)lCIZa0mfcm{GD8B;Kc97LCn|3IFfsbjPhQN(hz1=FzWWEV#ohF; z3D4{QjyiotLZP=6?h9R{d=dL=fB(5Qyc7G4QOu0~C;E|0U4wdUNrMLFy;F5ED_#M# z&_P41#}vc1y?W=f?=Qaje24B@eWYr`?<=(5L)As179QPO@#?AEO|r95;uJ!uAHtdQ zc*b%to7%bu2;+*Bt|@I8-%YFbvPwap5UDZ#i81{VCp`pYmeRT<8cSVTI)00ttv(a0 z$k1l5Kn`;}uVr35@lLQV%31!sVdVwSHG>_T|1+~G)cI6d0u&#*G;0MJ83+w)sQ0>+ zx_3Uc9dN@fxv|MFJdl|DGP%6{@v0R?u?5{WhvY)v=a%#vr*2e_e+`~0bP}{=4g&Z!|^->YWP0D$v63?kI6vf`LU|D5uh zMTO_Xef*G%K}-iMXah5Mlj{#a;;-%`TS^R;f+^~Sa}Y66!lU}+ERV>aA$8fQh5HB# z7Qw-NtKC04+{E(TCdwksn(`0w5gHgy77;ea!t(pAWs{2^Y2=o2YCjZuJw9CEd-awD z0#oIcSm;bH;{`omE>-mVckB67auMGN_3hkY8_5nez}!j>i>_d>)p2Sv#9BE8djr$A z{LgNPe$$Iwv#r=@1P|n{DnrP9rn--S=bI-e*`7^yHXAz@(QA}hH?7eG!jN_(RF1xe zZZI^6 zzo1xNy7k7oTP4n-cExHjv%)Y$L$STq%>&aHQ7`?NBIq;Jq@kFI6=rrx2|BJm94QlI z{KUS^y)w5~M?_K$+Slw`|7mb|BvSYtD;Q;q|2+iT^e8QekB~y#Qh9L3^s7{Wmv!fV zW~&nuaaS2#nY6n^O?>&o6PAm~T zIW42+(8(1UF>v&zS?3SkuX(O{NoXmEm^fD5RSBXAj*E`YTo?Up#>{#dUNgD_alchg_Dm&dr`tIypO(+fpy?M}oR?u$} z-@UuVIH|YreXeOm*J$_I(dE>=sU`l&==b|H!|%?Hk8Rt`bgXL?!QEiIqUo;uvk^JBqoJ zh5HBDutGsRUUY~8ULSEb83}&5s^;akY;GIC{qWZ!ChD#N_HpdY4>Cct~e|9wlho4P| zETLC%(!1TkSo$I-9WxN*+dKmIZSu9*>*1gju z0J@H4>^pky;+{~Q|9bc||7x!RLB^-6r5892zejDq|7r;Iyyxc#x>*8O8h*T{{rb2c zx%e#Izn$#)O!Ax3iR+8jPhT!1725ZHxU1qQ<-c$%SA-Ike+&wFmttL3#WiyCe3WZJ zL7wLE8`8m=(evxM$far1fRcpDh4--q8H+K4E88#!+RN9r!bsRR;iAf7m*ui)su`uo z`0K6VUr}^vi^5y+5Z|L~SDHgHOWeG2uK9XNtL0JAX7v9!B=?gFdd+HOiEiH!&u4No zEV(XW%sOJ7xlI=2ka?x)M+OGox0PDV*sfjFk#G^kz1MkGpYb8Lq=H0Ka7{DVlZ8U~ zhwaA42UDgBha1hQs{8#BO`%GiZY2Y#mCF(FW@9rqD;$8{{Aa=l%JbNNnUNN_Ki?pe z<{JyP_M>m9*DfP$hAG|OxN|36KaQ`i)AcFjsrE)e|9$$^Ug2u9*%JL58CNcA#++_< zd@W1RhFi^+~OlBR(4)oZq2eLDWaAZ8|hL%9ujDJ8$osYPUY3ZMh(v7s^j zbNxfZb7Ae*L$<+UWcC2O<2=|5V_WcY79a?q*TI@@(4N7wu|$<^ys>Oj6TB zga2{q5G6o}zS}Oz=}1h&s}wdl_>w3uIpBgu@7-qQo^G2UjY*j=vUTdJ%7qAZ^vJ~a z*iR%~tcD)y9SQFfLgwy>h(bX14%3S*pB=NvqldiT~r4O9863) zSEQBTt7d^)GU2~jTHFdFwNkOzbaz)X_;m2}P{Y7R6`U2{0|faW?+(go0wuWz-GP*c zY?`@rUszUUZ8)t}dkwrpCl;7aiZkqAStw&!}-p!~@~SI;w0$ zf>E1GkPwWoxpRIdEp|V9yu#O@xa)To@##rE!ymHd7OI*Xt32C}2+N+nVUK@IqnAZU z%vNA-b_!u^k9R1@jMPM)qpx*@)OD71xHIC;WM&*D+~u4tqDm_byT=nwM4V`v795-s zyNV_ucrci{rXnj2s$V+AhO>CVQ%xY&?8d2(hn#g`l2)Qpn!_^35{UKXUw3y8mYQ4? z47rLjiPj>b<)>1e&62-2q?WhS<-f^HJX@JW8SLTw%$mMU9(_t6Yx3@MCN*p{Yo5>| zCLJ93e(73+OeA|Rq{+$4&=xLk9w6+)B}b-~Ys}$x*4lrrZL>Opl^6>!oqVA(PVP1J{-NP~8|7oKyQi0qB)^=0Fh{hcWEbt@&F|5# z=%$<`#FuTEIi)bbkHHQo%;%u?pCh;kF#;#1bR#0HRy%QZ4{~phm#zzp=S`v=-t4V>?bsq)x@8jsB5op>`t|AsXOFa)(-Jb#aE*8}>BENMXfjh@Zci?MiJ^h%noIot zUgegowVFsiIY+9KqyGiYZKy3Q?~9cP`;|Edn`Fw|?#7(n7Kms2PWDiJ`DjX{k6%0? zp?o^u>J5Vy1YIFk*~zV$r}&15f6p%REYR}291cnDu-Mw7(Ih*G+%SPFQdf zyvI6#He(2--e$g2OeI=@dg1%F9iO4D^r(;T`RUKKs(<=q5v;Mb`Nh`X-x(WS)(9jx zJPk@}KeLZ0-A#MZowYS@SK9|}y!(i`pa`YDR??vI)eJ-dXUsZRr=?Y;ziWh$WbARF?5UHrI05;}4U3I8jmqapZ+cs$yP!aLnx1U?QuH*+ z*|BeCD(GdLO_aE9v-G(y`Oti58b&hv4}V zcBmP|HED>ALMU66Suxxu`OSRJXiAtMvDkL?4CwdaV}EC^eYkeq)1;+2;OD)1h-V8H$WfmdG<)KcS@*U~dcg z`M*!6y97%2*J%<2{Oy3gBb>1wKcCrio4zI#*zUnB9TC8cz3&_C_$nj$tU~}Z4KhjZ zD6|@aE7JmR1$*F_{KV&=53^>p3-b7uFt)2+uHR> zqwbPGoUiZ7RflN1%&DavlQD1jG-9YZZ#V|g>u}yu_@l|$fsP;(-=I|AzVhQ#h#6R_ zWY5*$&`08Z@}&4mH{T?1#t{Xfk&@RdUbvi3fVR!9bhaRLvI#V@|^_KROVHypbIvis%Q(}OalPh^e^T!mVoZp9)X@gfqZdsM?# zO&czYT&`!69Ej$yg*8p9Twci?Y1|fD;PaM!?LQ8Oi{xUvj`Mwz>*>}dm=^O3f=Mq$ z*|xtE!M)E|QKsx95AnS^1%fW}+IG-!aAWW%H@&new6ml>6R_Y_lTqi+uga)9|B!$) z=wlshwD3Zk>nHu!r{bmC)}&R0ADWf29Ol^H{5w|oQumZ)f>Lj1Jb&>qDIpvLUXn~? ztllgRMLC}j&jbYG>ozhzL-LJX69qKb8vp)h5o?6p-aZ4rD+OmPb9MS@@}GUhA#HCc zG7{tWK~?oFJVHyM%=AohIpWHRL+^U{8~Wt?+Kn@pY?xvDY?tl_lz60!PuP?mAQEhq zAn2F;C%JrHM28dS6>RFL>q1%Ug_ktZEp9JyYZdc-C&mkhgyim!*5m@(kLRtwTo9_u zfoaFTP?+K)!?xWOC#rbLPsQkwRXp%3u^oAz6VvfJ!;K@|#HQfgOxgRlR}4bbBerH5 zG_)X`^h|uN>OJG%8+7WVlFiv(Zw`M~AH9XUP(~^4k+J}uAi8(-A z7}>;c)G)J-&^M@iiK1iTewG281~l00fl~~(J8-}hx)^sm{By^iM-~krFtBi3yxRb= z2=`JbJZPzh)$lCLy2z`4N5ADxX6wWfz#zOr_u6NM=ds77O|De!*iagBi>pUve-tW4 zeS8Gj`NrB(ElrWSF<;)HdZIXJ4(IS|3G6`6+9J2 zg0n0NEs#?hr$FYJgk)B6RgvjUTKY$`Nbh)}xRv6u(XFae1t)7D1c^r3K_CA?6dqrm z8U8^3p1Ru_B{iaK)d5j}6vC0}s1Wn>xuP7X1RaV%C4lx%cTEU!{0U-JvdWMpPxWlbg%IS7b~t+3U4ux}lZypVd>EQ*)j@a!usH8WOm>4%>D z75{c1IP79mFn*NQ!?7w;8+5jp!|&)1S1Z-v<%qn!O}Rm>L5ZrtM0P@H%9!HeG(ZfKeyw^&Gr0``C9AWj3;7M{GrDpF=DkZw} zM?w@8Ht<#Sz9Ai6TELgd+TwV_W0JiC_P+gGz(tO@>_#V-f7mz))VBPdtcg|8AGF<$ zMXZZ+slrk;9SA#&1l)`yzax6)8Ihu=)ru{AnGHF-5mAwCu7N1g$8rRRg7kSe-j|gx zX4XRm-Zg3DCsZsqZfl>?6kLhl}bwzqss2 zuo8nnsX<2d5-_N9vMLwoE*bM3?4riklv{>vR>n@mx;mJw;~KgU)P3e&Ot7ZJ9rt~+ z;G|Crb>k!`Ofvm8?DGu8wG6K!;DI4jxL^{d{DyDEJVyw{%f=BOXKH<2x>|AnS-T{m zn~lFG5UafY4m#N`l2-4O^@|;C^zMrss?8pb4Gvd9_v2 z=G&U>#k>P6J?{?lmen*34x$`PvPVXa=y+U16(-84Hz&%}LWpOTrH7phL8;Ff+>#}1 z(J7lEVf3`Wv%*IKv?@9MvIA_W-2NpQq{PQ*7hhY@W8SUMnq1v6UH5Zgy5V8eQ9+k~ zIi~l9$0}wLWC@^-aLLN=#{ONGuAxj4b23s<2Lz*|P67xv0m_ zM(#~vdB%L|AnJy}QxbdxV_HY_mx;d@z`{=Jr4^GOe@l&<`nm9$pO-~CYFPNx%fe?_ ze9Xg#kx&JH?>Vj55~l~eXsgnr;RZp+MY+j0jM4~r7ZE8e5_>gxzHm zL_GJTJ|IRoEgc)hVcm{cnh}50Ep$=mV(B+|E1X{@RC*cgX?Vt$hKa&7R7V{xX3U2j zuH07-1@aCkpS9_;4OqIhDCqk1;!9cZ;_2e_PQ(qOqi@ARZeF^ryK>mE(!rI+Va>Q4 z^1@MI0kQ&%P7M15xMegKuDL1PQsu<|EB5<*Yd*}aH;`E{xKepUFfzTg%%Qwi%5H4< z$LK9DlSJzN*f%L6PMDq$Q&$?e>!=o% zG+E%4I(YYI^?6=A;`KamGFbLLYsnJ+z=opB=fE5vu%GCc>D^DjFvFks$muDfa7wDs zo}1gqi(rp6ZzHNW263d=wI`jM&Zx|~6c)^{NDs^JEbj??oKO_hw>tTxTZz_5s_Vi1 zD0>c|ZjM?(k!mH5m@m|R3^xS>#0z;;ZVM1|y+TLMw`kB$T(BBk8Brg0$foFc@v~*4 zK=xzx(B~`Dh}(Mep84=)K{RHn)DuGl?BYmb}X!BCO!mmOFUd zUcc;9B)o2#8bT@AZWDrFzGRX{to{^hw(pLsnSrd^dKV@salFz>epI)_mKJ-nFr5|e zYVtE{raX_`Elhw0#;r64`PxRow#}x}7ooF;T>XU!N@>c5`)$;ZYbgfUkG3CQeP}Wr zx1#W~@-C(9aI}(lY>?=x4$xn%NzXY}?hK0TO3P=;gg?r}$QN4kY0>V()?(|IS?271 z3ZoNY)-3_i+>nE~XH=ZODFbm=8Q4t`2ICY8ns3dVmFqcPC>}?ar=vto7E9G|8IdD>H`t$Di^)^6Bi~*&D&|Xe-bSm+olwMF zYm_c1eUVBEr4m*;otBavLTgFB>;(m{;>;wtI}l<~hV{~~^4I0kv#`^iY9_=Vy4C>^ z3EnE=TQ3mxl%`05Q{KrS$RDvC3Y@K&hL{q~~QX=xdEyLGzU(}pLQdu&^WknJYx?-=@pbK{*sF{Y-kv1B+2M=kNz zgjqhf!je8a9kI8f$P}A=a?8uly^%yotq0hR=i;Kp?2Gy6u6*Uwr=;Bat_&k?Gi=RG z+a_K|dKuAzDXT;Gk^X2&W&tlnT}7#B(!F8f-}yx49TJ3tIpWTH36zq?x9TiN4@ew7 z+QjUfK1v7KvR9x);`e|1tK5MF&uN3SHOsWHco2WGxyKfOliU27@}#SW&(Q6=VzSgw z5HWF)Wq|;zbF-K+KorFxgs56WqyA-N#Eo1QqSz{H+R+IPSG;k@k2b+SycmJa+#i4& zvTpeMmq~1f9VH=4>}67Jf@Y{wzX-X^p3PL63Ryz+$VWcASAW2shmtD)0o_SLe3saw z-(fW%Q5XNb0UEw(2hPXT(|^pLc^VjTeAX~hL{vcwK>ba0Ho<3q@a8w;7=R+q$*(Fs z(DeGWCPU6_vM{m{@gEWclo`mW|0r4Lzrq4Nki8F&bF>ga$NT98fm4C2 z91$Q<8^5LeZEi5zf3QPaddI*kesGA+wW9>B%naX}TlpyCFu;80+1hI;s2-NKm({Tj z{QRAryVrl!ou3X4*{A@OS(uSWkP_q>o8A8`iSopLpeplC(_CXM;KB2wDi`V{$5Q`m zX8Ee=FJVd!^IdgvW09|(d;F2h-Ha!e=k+dz$a=^vWD1RdRV6Zx`af1w&KyKd92&$# z0GokZ-bugti=_GYN-AWnBobE=&ync5tbrqOGwaLjN`lY-XZ_D3{dCDFKgY1Int{?e zhKEKT)QW;x3#L?_+T{Yb0dZ+8g?z0~p1$wFe~oKGe;eE%G=;WzpjU)3eVWD4K%RG%!kbgAZh-dAI~3TM`@=j;WQd4FbH_^L>&Wag; zfrD+M<0_cfRu_fNOrw>J_wz%VwIu(154z&tzIsS&dkuu>w5_t)Gs0(W-^)6q%Ct4) ze_vSTg_vf763C6!Ug)n^{ns-X0^y5Bs}rofhNl+HwCwr)LBWXXZ$5hSS?p0uKvWiC z^lw~}E`kod;r`u_0itXCrlB8m9zzvqM zla=$c^u-c(gb8}RT3X%zk~PikSe}uZ?7L45uSS4w;DWb*ZAPVky~fJUZ*qQ<_N=ru zC;+;hba3Y9ud(hE{MQ|Z6FK=bOn)Ci61pYbp-tX%WPPXm?9ALNU_%7Gf8FCRk@U}* zt?gCxw?lHg8n?^l{WrK~_wF9Q%dF3^v?%Yi*tK8qR-ez$qnstbhV3s)_Ok;_S+Oc3 zKKXB0S!rtgi>)9BYy(~G<}`Io+#-LSphR4x7QEwyC~q7KR%$`FNRM4yz# z1bj+0YJs-+;8^e_AkzqXZ9qLL; z>=qJ1v+In!N1M_O>l@Agc|(#w5>@^lV35qxIbZ2wwvT*oZJ!&T$!SX)IBrqwXP4G_ z-O}_lsOOOFn6Sh*Km6Z^_7yDw;t)Ds9L<`1vyb;Nyq~j1%jg2LK~EgDdn|?(U&eY%nIISfGs}$)!gr}xPNz|$D))|UK(r&;_K4s<4n;rsqpEYWH+YZuR;`*o z)aG(cuL<*L1cFMky(#G1^|SDX7Me})mzpzO1^p&1*vP6QLuYQ-||L8RLq;9`yzf)eR>ioL*(-+0qa?={T}88G>sF|Zi0sbXkpchTMw4H zIhty4V*WUZOF1^hFStWVYdeGM$&$kRTNlc339A0ZP2&w_@R-)&G$pSuLwL_w&zFCE zg^Qo!e|`nn44QYpc03~6i3gk<*ff^c1-BUpMF3^xEK=eU|3HbtAZ-7@IW%Q0m8$b7W=9iZ@qQ zl$`100vtG*gshb-X2PH2THWE_u7-Oqo7U)RrLJ#*X)OH zG7P@apkIpE2kzG!OTFv9fQBBAKf@NkA*Mcq}=2`c1C&YhWUosy5xGY=|<%;r2M=@ z=0sxJh50Yv))Pb z2gMpnL2;0Pg!6w5Caa<5AKveiWk<#|dP7oX{!NvYVr9`q&pq{%2L8)uO$*=yC&djD zUk$bC$R}&;9uH&u@f?#cCN{WP+=V|L_t)p|UfHj|{PE}ij~C6#jD-$toaJN{7S1lL zGr~7!-1mT^)}8l{^^mzi*HrNP4cN6Crq@sA5OPJjRl7ErOO=1jD)ZubqGBTFc6M(}3*TTwQmhnueO5bjg-WH0DoS6#4irhoTBtbo!n4(; zoZmVxjr^E55P$|S zx@MNWjoUJ+ko7U^6>w>KwjJCsT~c89zsWw~4%^n6L)mNz^zCcFIgVsPDJ zUPrLev0i51*S}F6$Rz@v%dg|@9Y?!toE(u@eif9dY4*S^slqFc%~ryBquGbkK2ROn z3$}ZT&XhzI?jBHhuIbT3%BQ^Ia{BPG=zUY526^Q7V7hWc*cP*$T(}c9 zf>CL3Sg5ga9FWM&U@8)CJ6pt}who~@<5c=VXfvFwfq^=y)_wkx%!giea7&8;jcz+> zYq_2sS5*9)Gdt$X9^5YG6Ff~YYHO-42O;Jm`YEh78%?EnXQzhtHQ%NyDF6^DwtdoG{`yMsw8A)kA$)c%SMJOHTT#4pWdiG51DA#?K(aNRHgkxKme% z#bKvdt^WEdxP(uq$95tt?0QyOhnIn*GW{S=vWU1%b6p8XuYLPyqUYQXi@N4Iv?TG) zt?RLU`OK-dmfz4}PoC%Ws1~>1a_FVxbmj-z8$U<5XGA=2wD#hd@EL*!Zro_kv$WCn znYt3^Mem&6iF!P`Y}6+AA*-yuk8NI+NG+G7cF?1iAtqDWke30}Rb5^8Wh@on1j5wCk1vLXNII3kIav%6C z$eSc%UUI=SizLk{^i3fsDI!K#*VHWrO2NK-VYPJax4W-*g!C(ZS#&qZbQmp*&ZT_5 zR_A;j0W~)k$yAy=+fI?Tlne#zpZ=TJxlnrvU%&0Jux zQYi@f5a!fC&{F35Iu*h-A}00$DY0cwsfV_h0n@a`@U?Uj4=z7W8>o9$GA=hK&?AN- z_E_L+EMjndH!r?PI+heN5E?V>)ELpAu~keYp4mj0qn;5Danphd&H&pB%zLDJ7Lqtq zK!)7EK(ud*a@Y68!Id0(_HjKaEVSjwt6&7B20&)y$2Y!+$7tC%7NsNo4}Axv)n1fx zz36KKSz3TLEYZ~;yN zPR8@Y(#d-{>JjBUeKN7fe9YXW8U z`_yIPlbr|_A|d;eCp|fL`6a>!ilIUArRJcRL1biAKlZFgNna6aDLZgO+G3zIhS)mq z9u)DQs;w|c=E;+1IoKEOUmHpa9Vkb>w~?uhp@(c36=Nt*_2FAng|gv8CShVO+JdaL0-nkoV`n_gT)zxrO1K) zjv0ukf=xmpO^KSBp3bnc4K*A}j$OQ~?mvqUZ+$hm@>VocpWEIkruFQ#Ot+AIeDI8$ zw8uQxI}viobz=_%{Us2D@vtnqF{&mNnb22ND7e1EmVc3$moUs+v*Dg}`y&i9MS=Dj!aO^p<8fxZjL4(Zpz9MevTEimV1&8e%(S_4p zOFGonmvaC>a41LE;1d)bCYC@fE|Mpe{ad2)IG>R)sl)5w!p|J`NkYQHSreRJ1&`Ih z!-7$n)7fX$<;yk(4_M^;Mze#q*H*n&nUMoE_^biq7p*IG#d~?0emlClt)_xeTf(12 z)jdG%bdMGainGJU-b;arwd51!tK!uPoKl}baqoc6MLZRik4P*q8C-XSzJD5F7!oco z0|Q`K!=y^6{^R^0T*2qJh`WPh<2c?ay2Suic(16IDL}ftCh^ z0+7z4P0sTxX*jod2^M~URzC7(={`X_&>5S(*qIoeD4vJ5vTrU7rYE9My1g&|=>g<~ zJfbWt$cRWu8M*b9xMu__>MbJvaUk?E4`LQk-k)|5hlxpKRIS)7n_-$6(r3&d7``KqrVvwa-&R3r^Z#9*q zx!)lMv|}k*bWm&vC``s#g|22CbOeefs4l5yR^=8PFFk@AXqmFj)c5JKbVyEyidd+C zRvQpfsPC!AmqkY}-*0R4M6HW_c`k%o!@;rK%lf@KXe<`{Y9z{=y&}k}*}V2{a}UnS z=L9GKylPw4hwJH4%~L0_!8rv8j9lm^;L@CH_ZCzSemivIG#;D2h>iT+CX2;pc+#fI zv!{wdr>AeaK{C~JZbv?Wou}O|X7>r69h0Y%sCvGF2YgA7tV=dPIuw!70OK%J;~E-U z$d0au5#ermneJA;OyEPY6A+pJ`0E{2MO3ix7NLN1dP&H)+bktf__noY=ug#|euShY zxmwB?;Lg}8fUQkE-CoJ8+qb=?RTUpPzIf3=ooDs-gAhzO`(*{7=-{j!PX|7H{hH8z zg|#`c68iMyl8F`#ASI3Ey47?paf0$0NV2@o(_(4Hc3doMrk}w^@=WOIR2PPD?ki!+ zL7?`*7hCo)!m2#Vr+P|wx_}%!Wg_rLZ;2+*0z4;NTpL1JWwc=Q&OwOD_=bhWm{`|9 z_l2$#szuWoYCZz_Q&6pMwW~`ZXW& zX$tsxRcpC?x+NXCq^;G4X!h4jNsLMAJ_8{x7L9S8vO)^VQB^4(784Uxs0u_zGV|=4 z++8ar0*TN}GA6s*#n$*!d0C20v5e)EYbs2Mp25tr`wUY^&6Z<^YcfwNxeq9{?@v~? zlgg{}hT`Cbl%Ll?MWCY0&awGW%=WBdb1C`}9E=|pxWwd2RlQ5aRy*?h+8Bhpcdkc^ zMDoJr zeKs5CV9EQ1RGbS-jKVKhLpi$AKve8TDjx8CUb3ESgXgJx*Om67-4&j40cy3DA+tlo ze88Whay~%>qU+qzjN?k8uC#m9;4@v+(SGj5KRwa`zo3*?-l4hd+h{J{}`0aC;fyafCgNja^-{N6=3rUNBQIbP878wZJi44>lE^ z&kuPxiRzWzi>&PMz*#SXBxYtflYYNLd<;8E%AO7FG|13JzbMmh2qht$e-G zQ<|EuhNOvJ06q1_R@H*q^mpw$cFT4L%R|@{Bd+fS!rhHM5AJf@$7d*?S`Jor*SvGl zL*QhYa6Y3NVs4w~QP^lxRI?+y$HZ^!#a$J@xde-#_D)8sU(fZyV!v6>n_551sw@K5 z9{@;`Zpz)J-*FG!J&`T;vEtC(Y!dv)kt0gT)*v-Vh6x}=?db~*I0ZI~LghftsB;Oa znPqks=FZ4=_beT-sBp|=Pj?@95w-S8HXv~*E|IyhIKRjD9;;uo| z2_n_9$>un!`@QHd=Ygj-S>-oBx~?t-A$q0UH>{Rh1Zu<&rG0&M+vw-Gly_Rte5B@0 zGgGwC#81D~mM}+qq4vv9Wb8-At~pN5f;3Q}Wo59^G3BQCO1+w}WJie*{KRU@AXk$_ z@%C*vi)2DXI<)B}$Z+Z=2LZw;bvh$>NUGF>xTUVWp>~JsYH3JXID1YHY%e1T_B!K2 zbI<+UY~X5BsqIv)N~^`uy2g5i3n{i} z(GSsLufy-OHv37Pu`TJz$1LikQ2CXYy^Ks?Fl`&{_PfSV>F!)aIB%Y1>EmSOaVv{l z*B9*XtttXi)>3X|BFUOAjhBGXLB>k=w}moN61(^J9dNtAFIS)kS_@iXpE9?;wRKuO z^dv}I!CW7Js0HtO@2C#MdL=pXdj`tBA*;?i>=p<+PbimKC(bO6d6>n{4!e)4wz(j) z`+WM#bcd2P+`TH*fZFuq9f1~?YW>|+^q1VfWpH$=pDOI09asP2{ACZX=AdMI;&R~t zAu4b!JdP*I5_?iXs$JET)64LOS8DWf;WS{vCn^+mVr;!DotkaCM%B+(HdF*%NF}nB zZ%*y-7K=UR$6GQZQdJ6~&?>p89o+^!<*eG3Q;HQNc&BA;%9~Gul{kc60ga~V+2g7! z1X{5c6F=Omae-wA;HBL6zEYQ7Mfie}N~9CkgkgEXea$+vbfN4{ud`?gJgy)F*^TXe zt>XSTq5N*~V88}5q|cWZG*St;eM2XYHrBA+jdHBYD{$-E_wO46u%s&3O!gq&U~joc zp-1f8vpp&vs}EMzYiPl4QwsB)_4Rvg%^G#L_XL*0E64~C0cl>r*LfUyP;fLZ5cAM*&oC^82MZVGLC#Duv1m6aU|<5!b1N(*$)__j2q+1AC8>(}jqA!sDul*m@Nr0Tbx&x=_fzF)0> z;60(oTO(Vi!(}E?nxc1;xbaXpw-uGPVza=xTXqm()@!(3KKnC~K|GEtN8yht0g*2z zqrcX1Ko^Q!V3w>}v&+?jcI!y4HkTs*mL9fV*M$^iQDqwNr10;|F?-syA`;I>=W*hS{4%deUm>1kmM0wm99Exu0sp?xAPKw1?d-IlSPAJA?o6BSp z-4uIUF&rg5f~yZ61rgL`R=t&R#LG}GcTiJf7($;YR&`+ryn(-4Qr1o=Ri#efWxja+ z1kKHYhnwWfAC0MJr504k`XKF-^nU@Ip!zX=rmr{cO|DhuTZQM?K;A1bpT3^Qg~15c5Ua`?^(;=Jpsxr$sjxV81LV=V#6YhFFg{U%V0d zvY^GA7i-ej!|ku#+ws$in6|YT5c4(Lb$kMgZ!WHz3=NHTcX1b=tny;?0WiU$#4u0(z0m>Rz(2fy~Gic`#J@>h={L;$^i8!0XGB)^csytNkwe>uM#}vPyOqffS9nN{}*rC}H~r>Wc52;XJtscBB}Iu612*o)@iK*6iwOugK?iu8l`@k#Y# z)=SIa>bpo4VI3NS4LFCX^$)2L-N@$!FFOm8k6p}QAv&eJc|AZ7!v7A<6Fv0ay|Jsm zr^YfcvxB-?ysNy2JWmB}WF%Zt(!Qi8nW=|Zk}{*K!hoK|hyCSALs`?-X3cn8?E+*F zKcD;J^-S-D51dwNy;W*(agH!ez`V(_rMi|V6CFSwN9afk)o6RuJ}UqCdQW5>U{vXg z7MLo)_%i*1&iz<#bJ>_#YgGrX(Qs@1^5Dsucpbl9il6j?xp%_d-oQ&xNK3{zE_K5` z__tG%IK>94j}^4OWs6Oz2)Z4VmpEd_J*{zS0@c=)A%58W39D(25}}?^8#o`MV!VON zkK|0?1HSTtC=WyJQl)swK#$D^hO1KXLf&HiExx&n)g#I1SaD&ZTbx}x>_#bpXe&_j zJn_VvTdW={J*Iw!ZD{Q=4XS$9yEStsj!!+7{_EzsuG#6i?(Y2`*}|KOJJ*U9cV7g{ zc@t{C%)<_Jj-Tl(6z@v2jLssVN)u+~-hkW-+C9Or_ECq6UG^4YicKl6d&VwGNfM?}pwde2B&7~!rlPBoT^0daHbq{@ z?c5Qa2q>LYz;%|f7}&}2CSS*VyRo{E4XFZ|on?}B?1&5I=P{k0ZHH)YEg#BT?dAtW zITp_bK#(6T&SufwJo|5L3-o_8ALTp{UqA1Ekh4U}yALqcpYtz#2$&iCEmq$BTKpiL z`f*qemXi7gi*)M0grX2KYhk6BRKn5my~%?n;W@2I1HS)ix=GE>u<=1oge#~Q_Qn_RLo(=x#gwJ}%R$rYD$Qrpz&Yszug$_)kF071dh z)N;cOP!QCxP*HIMR7Aextnd5%zJI=tKMp_m-RGR=+|P5)dG7nUuKUtldYD1QG5Q#( zN!|C7=nHM1PadG3Q#VDcp`k54=$&e1Z*b#rTdU{PRGCp@8|7b;RbKKaDm!>2Xq%V( z1XkzZvq5$Y06=a4i+JDf)8VT&36K6zvLO@ASEqL17UPAXa(M}84nRMak9%?Z=~n`&o5u$BJtYqplWqaiEWb@7X1;>W7yUX^iF43=6}w)rb$4O2-O%zb ziE{Kp#9&WVlG3zfjArnM*v)xO^*`o6OFF6Cofk{y`w*+|M!}N=SLa)2#0rGp03oKI z5!_Q&1+^Tf@2yIWV9L@%d6<-o@ZlXyx^x z9c2J;fMF2f36nPPLgqg+pWc4{T^oE}*0nR4=GEn)${Y@(u=N`N6*?JQ6sP*4Z?|rX zDJfpM3@Dsq>l5AlkvRsx1Sx+B`=zqm#;OCLqVi3S7wuK{v1ot68|2^bYl>vD)#>|G z9weQgfvpU7b4I>cQKNdfVjhoZ+UNCF-LA}>L5ucE5(6O{3>2ZSsP-h0{Q_k1YzYcJ{OnJnFz}m zg8BhZIZfgUO^>43$3A|1*3&4EC)ouB)}Qd?QWrh>SK`bXRAbdt3xU*Ut!f*bd38L^ z0IS!NJlwoV$so^zZ-P%|9XvY~>sq*Oul+}!>IC_`ff21gLV7#fkUQYu)U;JtAC|Eu z;}L2A{n<|~$xS=dU~_mj0$QF4Lviw8CpVU{%sVT>-5Ou(YH8J0f$i~lj0!RkG^fHg zlr*E!?EA|qJ%K)iM6ipKkNPz~-%r0u@OU#6dTSl;6EXG9<@D*(21NxX^C9!%v!i70 zgP8~tO4zUeOdyjyez;oy`KJv6?yXss8kQL?uK}d<-Q7>v*yo>{j~Jv{8uE?q0J;Z} zrET!nPHL?f@y4Z%-45!?YCUcf03P9CQrJ-vz=K@!)2p^-dwXh%*o3A}ilYK`SB3+LIwqdP_~5F54MJ2ZhHIH*9yLZ?eNiIz=evS| zX`-;g5FmA42(s=Dh_mwth-LXq#wc|@rSf}vwh9={_V+l_81um%z_ zQ@_~)6p{HdOY$)+t)+5Jq<><|Y1rhv{z>}Y^p~QV*<51B*yz((!@u&nKk1$Qe(jQ_ zL1SrJuP`M%p{Dw6SyX`f0mY#s$9ZiN)9G1u(bIO^7C5NueixCQ(t6^c7k>=V<4V3g z#`NXkhi5LZQGHA{Iq-PG=gpJ#y=6t^Wxl^jhQc6CUieg!N(iQI7zso0Aa4Mo~j`~A-0bVFf2I?J!jkvaP_FK#YEZm95M&J0Zd;7 zpJWhvI@9Et$45*7l_MEe;?~=;x^NM@t*mJR9pu>*OfNpQ6>zf+UNz48~h&L>`C46!1`Q=Bu6r@Tma+PxoEDZ^jiQ#iyD)VqebE#;248hS9e>+mr zrdgd5J~)+AVDZ~Vnr{+jJd>?1DU>0~<`nrHKfKq#xqZs^X>B}~>osOE5R=A@OTq_B zyJ#*52K}xxcbZIPWf_BG&~TCJBE_F6?BUHP;-qgT8v*S>jc(ymDRX^_{0JW$d@ zED|yuD-_$#XFgmwy`?9jXM2V!^&>NyELi0GTzcpjt_WCX3uwX)`Beiohd<_>!;NpY zblBAt6Y%4zlx5;d>&l*k<#6*MWe z_uSszExs__YG;S8)0#M|>qkuOrn|PUZVU$}I-tLIRAkDsoJbxJh~LiIlqtt?Xw8n; z&-tGY-`BdwmJ0UBm4bptM`;$D=24j`DHe!p&u5UAG7M;Ziqwm9IrGUmFPobw2|I zMXoD63d&TeV$gwjYM>)_W3K&v8uz&qHDt2RAf#iiG)m%sEv{vEav&ZtegI*AA&na= zqYzwO^K7Kcg}L!2WnjwkMi(SMt@~ zNI4}`!~SV}P3;?tk?4+iFP$a9Zy~EO0)D9LG<Mc)FW^#a=~%%2KQ#mOcd5}sPUA(I5zIaj}r@+p1_G1L3@ zJC>W}C7Zs28FMtQE0Erzx2#+}U8eN|I3@%!gmLHK!*oxh8ajvjpx;*0PI^odT3J}0 zAz^oVrt5>>9xS?p?got$Kxd`&u@r0VGuK2~KesT%Sn+s^{1e; z6AL9XGEYDuzAjA>C?J_7j!V#b-=gwrR&=G}X3U2=%9!~E$!Buzm)qXe)(A00s8eM^ zGZO{Mt3w~hMQbc8A2~Y*b+b(|7i*$$ldWevRaW;1PK-@b}NsxUQa((Wxwvdm2=U7+x}Q@u@Tx%#4rR zO*pjPJd3!5_GQ=b?O8@)YttX@r*l`#p}v@e*Op=9imYp|=a1gC1XDno0O0cY-$bx* zDr4h4i};Ll_zV;_-$jjpejC@tHFh7|xGTEi)}Pn#Ey9s~xb zr(d62$i?ZBSK}MhPu3@WLgqX4&fI}6xgeR%k$4xO%OjZ)X{L#$C^5087Ae3ZUufEi zhf~}$!l7MCxFVu(cx%Bu4Hhg{r`YVdC^2Ww;3hd`2m^bBf7&G5!EFSSKozSL z+Eh_&p@YP`a<8*d*K61Pt6epF?Soeh&{k>Oz?>F9ox?aQ#No2-cmO>OtxcjsQ@OJ3 z2ELMb>zhd1$IXyPfxO{oTl393Ff*NHj|!)amBWRekE^NolG_-Cj>F}2NZ86-8%G_Z z97FF+X0uPaTfHuo1lsZzc_zh;_IlQgDNqjSE{tF)3>WQNdB&lYPSbsb_3slgxOQT| zYe$(WvcFS(Ybo^#kCpaoFU`VOz2s?#hO%huj@;*4$;_c8WuP3eu#gt0)|H<3 z+?Ao!?&@Aar=y=s@%pm%?x3s?Qw>JZNY!3&BW8ch$fABoI}#hx)^WFL*~uRizI;tI zar@!1y;Yxx(V0(Qb&R_1jf20Ij`Xp_-*IHuE|!HfJA{EEH{4+tQKs*xVDmyiG!!Rk z|EfiR6R&6I?Ex~xS==Vk*!?T#&NvjF4So^n(2q3?>kor(^u)H*fnnt}4gmZur@{9X zDm}&1DT3#hY!(&e(B72dol*I(WzsQ>*R3LJEDg+zMSaLN7Dgd;b#*Iix&jhB%-6z@ z(3K4n?M2u+kq1_6_rz@1nvPULP!Px@3yNTI6XPftjFud~b_+5#`I zj2J||8zHd34QDbcueOCovC=Z~BwBF^IB>N)3^iucB2GpPy=znQ3TxRNRhZ(E@G{eVzwi7eD@02kK4z;$_r(+b$hv00Q^WQ&C4+h#y3z zR#m|^uX?pC6ZGe<7xhlB9+hn6V`qYc=(y&Jis8~ye%^8I8#3&UpGW?p4orag(HN=<|9171ogcxC!3XCASgpT ztzw$lf|}(N`#$&PE%({aI#=sf)J)>*Iz=|(cY4w@?IHWWj*hX*klemq%W7C$+dO2! zA4%wUx&>Z$5+v-QDBeHgQA-9YkGx+R!s&LB&vUXWn_qSXk4L^iekAG7XrvV&$hiGb z_zkb6H5jaA!`ha^Izk#vaLMK^`vj%N`>0}NxY(0tY0hZ$0W_^3Hv4+ zvPr@jr!^GP2MdGjX!?mtd@m>(53mnOjj~M7!g?P%>uMw#I3)M9DR8~&Q9x>?Y(G|7 zSNQ7DbxcB(=QQc&8s@mo{6oYA57djuxjMxU;BYm{qI*dQpn55U`~+ZJhRe>la3!en#^D|=;o&pi z#zaZ_-O;x{0?Q+kvb^uZ(=sl?9UV}!;#!V|6A>ZF4o2;SisC_fH&{Z-wgxnZt!Cs^@1-r3lLwD_$ACl)e+y& zBwS^cdx-;pus_0bd*v%~=8IwEAXd`2mZ?p0ly~C?*SztjqEHlpB%EfE zE`9IJTi_}>j}*TctIg!k3S3=Xp}|m+c8tSxm-cSjK2zF?0G>J-N2;E4mm?@vcjnSV zF~A)FOL=5}j^{KPcXYU@HOwZ+^t^Sb=!V1G zYds)Y(bz(^t3Qi~xZZi5x8x99z*;O8xy_4TA+l{mdi+^~yXw$`vJ%qDsKH^E=!XKc z^tRr_$862gep@GuEQR`I3y5;Vpi1kC&6A_BonX(-;;w#&VDCF>foG5~OZyR4xzs)wZu*i^iRbT>Y0WLC)pEk)&d_27E18^uSj8QI^1A?B#v1X0 z@XEA_3j9X6i#wY;j&3UKtl-==t;!(aj`l~=sYFw9pRA$NbBwCihDBUQMn8Qdykk^^iwP(egWD*r)9KdiC%vuxaCJ{joW2 z-%?NgUktOw^n;YeX6c&}T3-x&Biq!>=4}*%%RF;*0At;*Xn*qFy7cn%4ml-EodlzB z)FcqJw?;QcWmQ^$?QBNksAc&E7f)2Y>JX|S=7^4e! z9xFqFVCgsbPXGq|-w*H|JKmX_&^=lh>CWQWE&yDI5STa#`f~8^NW!eQy1_$+7O%z+ z_PZjzUnfScGzSo=ff$S;94C3c%gaSsAsj;Ts=UQ`* z_0fztZUQK1?TB0}Vzx1Cbp*dvR+uPF{tmoO$(;xo@K_wVmG#7eh2 z45t0Z3H!fG1z;byckEca-#Y2Lb$#cAf@SP7OI(W9a1NDW2;^^@M`!v0t6G1RU<7vi zXBzwaF`5@A3DJXA{btB&=8qHozAXYuH6u=(Yrzo^{pkN26eiaBj@!(Z4xx+ZL_A`v*L~-Ds)-76>+{(X6iM zQPCr)qvOGCi$6bRpFX&px7OYNwM%kT1&&QA;N{tjgS*g-EoW})DR0}T{{ z#);fp#TTZukbz@*_+@t*>4eh0^#5!m`I+N1a@R%e{(Wh)oBuy|?B7deT3J0Coa)l9 zVo^Z+CSyV>y0-SfpUvO?0{qU5K1S?9ssP^DL)#$0O;&>b=2vZ7{N9BQRZ(_UKU5;$ zPjzYSS}6DA6PV`}pq7?@-ZtBII{y9-(>IzhNa5WKfC{* zF@2!&$u;E5vlCalw4k2_?$O#!Z>Uu2zqxk8v2c@D5Dx)+d;%C8P^aRK|5Lv)_|3qS zOfefwtfEJZ^;XA2+}z~;Y5G0;*yRl7I=Z2HP_}`zL$b8rRQ+#C_O_WGAn1)UvGl$TUE3=r4CA6-{{=3J2e6nbwr&0*{qS~R!TP!4}ag%3NL`nDRoqx5Oh$z}V$QA4B KR%i>al>Y`?s@5F< diff --git a/docs/management/ingest-pipelines/ingest-pipelines.asciidoc b/docs/management/ingest-pipelines/ingest-pipelines.asciidoc index da2d3b8accac2..7986e4e56279a 100644 --- a/docs/management/ingest-pipelines/ingest-pipelines.asciidoc +++ b/docs/management/ingest-pipelines/ingest-pipelines.asciidoc @@ -62,11 +62,40 @@ You also want to know where the request is coming from. . In *Ingest Node Pipelines*, click *Create a pipeline*. . Provide a name and description for the pipeline. -. Define the processors: +. Add a grok processor to parse the log message: + +.. Click *Add a processor* and select the *Grok* processor type. +.. Set the field input to `message` and enter the following grok pattern: + [source,js] ---------------------------------- -[ +%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent} +---------------------------------- ++ +.. Click *Update* to save the processor. + +. Add processors to map the date, IP, and user agent fields. + +.. Map the appropriate field to each processor type: ++ +-- +* **Date**: `timestamp` +* **GeoIP**: `clientip` +* **User agent**: `agent` + +For the **Date** processor, you also need to specify the date format you want to use: `dd/MMM/YYYY:HH:mm:ss Z`. +-- +Your form should look similar to this: ++ +[role="screenshot"] +image:management/ingest-pipelines/images/ingest-pipeline-processor.png["Processors for Ingest Node Pipelines"] ++ +Alternatively, you can click the **Import processors** link and define the processors as JSON: ++ +[source,js] +---------------------------------- +{ + "processors": [ { "grok": { "field": "message", @@ -90,19 +119,16 @@ You also want to know where the request is coming from. } } ] +} ---------------------------------- + -This code defines four {ref}/ingest-processors.html[processors] that run sequentially: +The four {ref}/ingest-processors.html[processors] will run sequentially: {ref}/grok-processor.html[grok], {ref}/date-processor.html[date], -{ref}/geoip-processor.html[geoip], and {ref}/user-agent-processor.html[user_agent]. -Your form should look similar to this: -+ -[role="screenshot"] -image:management/ingest-pipelines/images/ingest-pipeline-processor.png["Processors for Ingest Node Pipelines"] +{ref}/geoip-processor.html[geoip], and {ref}/user-agent-processor.html[user_agent]. You can reorder processors using the arrow icon next to each processor. -. To verify that the pipeline gives the expected outcome, click *Test pipeline*. +. To test the pipeline to verify that it produces the expected results, click *Add documents*. -. In the *Document* tab, provide the following sample document for testing: +. In the *Documents* tab, provide a sample document for testing: + [source,js] ---------------------------------- From 755d63a1e9bf0f53e6ab1233d041e0029c1b3127 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Tue, 13 Oct 2020 09:07:04 -0400 Subject: [PATCH 34/85] [SECURITY_SOLUTION] Fix query on alert histogram (#80219) * try catch the buildEsQuery * add test --- .../alerts_histogram_panel/index.test.tsx | 28 +++++++++++++- .../alerts_histogram_panel/index.tsx | 38 ++++++++++--------- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx index 533f13e6781a6..9925dfd4c062f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.test.tsx @@ -5,9 +5,12 @@ */ import React from 'react'; -import { shallow } from 'enzyme'; +import { waitFor } from '@testing-library/react'; +import { shallow, mount } from 'enzyme'; import '../../../common/mock/match_media'; +import { esQuery } from '../../../../../../../src/plugins/data/public'; +import { TestProviders } from '../../../common/mock'; import { AlertsHistogramPanel } from './index'; jest.mock('react-router-dom', () => { @@ -31,12 +34,16 @@ jest.mock('../../../common/lib/kibana', () => { navigateToApp: mockNavigateToApp, getUrlForApp: jest.fn(), }, + uiSettings: { + get: jest.fn(), + }, }, }), useUiSetting$: jest.fn().mockReturnValue([]), useGetUserSavedObjectPermissions: jest.fn(), }; }); + jest.mock('../../../common/components/navigation/use_get_url_search'); describe('AlertsHistogramPanel', () => { @@ -77,4 +84,23 @@ describe('AlertsHistogramPanel', () => { expect(mockNavigateToApp).toBeCalledWith('securitySolution:detections', { path: '' }); }); }); + + describe('Query', () => { + it('it render with a illegal KQL', async () => { + const spyOnBuildEsQuery = jest.spyOn(esQuery, 'buildEsQuery'); + spyOnBuildEsQuery.mockImplementation(() => { + throw new Error('Something went wrong'); + }); + const props = { ...defaultProps, query: { query: 'host.name: "', language: 'kql' } }; + const wrapper = mount( + + + + ); + + await waitFor(() => { + expect(wrapper.find('[id="detections-histogram"]')).toBeTruthy(); + }); + }); + }); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx index 3bc84bb7c32ee..c96ef570c7e09 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/index.tsx @@ -221,24 +221,28 @@ export const AlertsHistogramPanel = memo( }, [alertsData]); useEffect(() => { - const converted = esQuery.buildEsQuery( - undefined, - query != null ? [query] : [], - filters?.filter((f) => f.meta.disabled === false) ?? [], - { - ...esQuery.getEsQueryConfig(kibana.services.uiSettings), - dateFormatTZ: undefined, - } - ); + try { + const converted = esQuery.buildEsQuery( + undefined, + query != null ? [query] : [], + filters?.filter((f) => f.meta.disabled === false) ?? [], + { + ...esQuery.getEsQueryConfig(kibana.services.uiSettings), + dateFormatTZ: undefined, + } + ); - setAlertsQuery( - getAlertsHistogramQuery( - selectedStackByOption.value, - from, - to, - !isEmpty(converted) ? [converted] : [] - ) - ); + setAlertsQuery( + getAlertsHistogramQuery( + selectedStackByOption.value, + from, + to, + !isEmpty(converted) ? [converted] : [] + ) + ); + } catch (e) { + setAlertsQuery(getAlertsHistogramQuery(selectedStackByOption.value, from, to, [])); + } // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedStackByOption.value, from, to, query, filters]); From 16e1598c057e2d248a37a7fd203ab75a3ef1a922 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 13 Oct 2020 16:12:03 +0300 Subject: [PATCH 35/85] [Security Solution][Case] Improve ServiceConnectorCaseParams type (#80109) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/case/common/api/cases/case.ts | 9 +++++++-- x-pack/plugins/case/common/api/connectors/index.ts | 6 ++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/case/common/api/cases/case.ts b/x-pack/plugins/case/common/api/cases/case.ts index ffeecf27743f5..52e4a15a3f445 100644 --- a/x-pack/plugins/case/common/api/cases/case.ts +++ b/x-pack/plugins/case/common/api/cases/case.ts @@ -10,7 +10,7 @@ import { NumberFromString } from '../saved_object'; import { UserRT } from '../user'; import { CommentResponseRt } from './comment'; import { CasesStatusResponseRt } from './status'; -import { CaseConnectorRt, ESCaseConnector } from '../connectors'; +import { CaseConnectorRt, ESCaseConnector, ConnectorPartialFieldsRt } from '../connectors'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths export { ActionTypeExecutorResult } from '../../../../actions/server/types'; @@ -133,7 +133,7 @@ export const ServiceConnectorCommentParamsRt = rt.type({ updatedBy: rt.union([ServiceConnectorUserParams, rt.null]), }); -export const ServiceConnectorCaseParamsRt = rt.type({ +export const ServiceConnectorBasicCaseParamsRt = rt.type({ comments: rt.union([rt.array(ServiceConnectorCommentParamsRt), rt.null]), createdAt: rt.string, createdBy: ServiceConnectorUserParams, @@ -145,6 +145,11 @@ export const ServiceConnectorCaseParamsRt = rt.type({ updatedBy: rt.union([ServiceConnectorUserParams, rt.null]), }); +export const ServiceConnectorCaseParamsRt = rt.intersection([ + ServiceConnectorBasicCaseParamsRt, + ConnectorPartialFieldsRt, +]); + export const ServiceConnectorCaseResponseRt = rt.intersection([ rt.type({ title: rt.string, diff --git a/x-pack/plugins/case/common/api/connectors/index.ts b/x-pack/plugins/case/common/api/connectors/index.ts index 88d81eed2d87d..0019afe7c6b74 100644 --- a/x-pack/plugins/case/common/api/connectors/index.ts +++ b/x-pack/plugins/case/common/api/connectors/index.ts @@ -20,6 +20,12 @@ export const ConnectorFieldsRt = rt.union([ rt.null, ]); +export const ConnectorPartialFieldsRt = rt.partial({ + ...JiraFieldsRT.props, + ...ResilientFieldsRT.props, + ...ServiceNowFieldsRT.props, +}); + export enum ConnectorTypes { jira = '.jira', resilient = '.resilient', From cd84ace53d611a4bac94007be11a8aefa0d689c4 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 13 Oct 2020 15:17:40 +0200 Subject: [PATCH 36/85] [Lens] Leverage original http request error (#79831) --- ...xpressions-public.expressionrendererror.md | 1 + ...s-public.expressionrendererror.original.md | 11 ++++ ...ons-public.reactexpressionrendererprops.md | 2 +- ...eactexpressionrendererprops.rendererror.md | 2 +- .../expressions/common/util/create_error.ts | 7 ++- src/plugins/expressions/public/public.api.md | 4 +- .../public/react_expression_renderer.tsx | 10 +++- src/plugins/expressions/public/types/index.ts | 1 + .../workspace_panel/workspace_panel.tsx | 9 ++-- .../embeddable/expression_wrapper.tsx | 16 +++++- .../editor_frame_service/error_helper.ts | 52 +++++++++++++++++++ 11 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.original.md create mode 100644 x-pack/plugins/lens/public/editor_frame_service/error_helper.ts diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.md index 3b3c1644adbef..9a2507056eb80 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.md @@ -14,5 +14,6 @@ export interface ExpressionRenderError extends Error | Property | Type | Description | | --- | --- | --- | +| [original](./kibana-plugin-plugins-expressions-public.expressionrendererror.original.md) | Error | | | [type](./kibana-plugin-plugins-expressions-public.expressionrendererror.type.md) | string | | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.original.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.original.md new file mode 100644 index 0000000000000..45f74a52e6b6f --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionrendererror.original.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExpressionRenderError](./kibana-plugin-plugins-expressions-public.expressionrendererror.md) > [original](./kibana-plugin-plugins-expressions-public.expressionrendererror.original.md) + +## ExpressionRenderError.original property + +Signature: + +```typescript +original?: Error; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md index bd6c8cba5f784..5622516530edd 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md @@ -20,5 +20,5 @@ export interface ReactExpressionRendererProps extends IExpressionLoaderParams | [onEvent](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.onevent.md) | (event: ExpressionRendererEvent) => void | | | [padding](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.padding.md) | 'xs' | 's' | 'm' | 'l' | 'xl' | | | [reload$](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.reload_.md) | Observable<unknown> | An observable which can be used to re-run the expression without destroying the component | -| [renderError](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.rendererror.md) | (error?: string | null) => React.ReactElement | React.ReactElement[] | | +| [renderError](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.rendererror.md) | (message?: string | null, error?: ExpressionRenderError | null) => React.ReactElement | React.ReactElement[] | | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.rendererror.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.rendererror.md index 48bfe1ee5c7c7..162d0da04ae7f 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.rendererror.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.rendererror.md @@ -7,5 +7,5 @@ Signature: ```typescript -renderError?: (error?: string | null) => React.ReactElement | React.ReactElement[]; +renderError?: (message?: string | null, error?: ExpressionRenderError | null) => React.ReactElement | React.ReactElement[]; ``` diff --git a/src/plugins/expressions/common/util/create_error.ts b/src/plugins/expressions/common/util/create_error.ts index 46306d3fbbf66..293afd46d4de5 100644 --- a/src/plugins/expressions/common/util/create_error.ts +++ b/src/plugins/expressions/common/util/create_error.ts @@ -40,6 +40,11 @@ export const createError = (err: string | ErrorLike): ExpressionValueError => ({ : undefined, message: typeof err === 'string' ? err : String(err.message), name: typeof err === 'object' ? err.name || 'Error' : 'Error', - original: err instanceof Error ? (err as SerializedError) : undefined, + original: + err instanceof Error + ? err + : typeof err === 'object' && 'original' in err && err.original instanceof Error + ? err.original + : undefined, }, }); diff --git a/src/plugins/expressions/public/public.api.md b/src/plugins/expressions/public/public.api.md index 355bd502df3be..57ad6f747e5af 100644 --- a/src/plugins/expressions/public/public.api.md +++ b/src/plugins/expressions/public/public.api.md @@ -511,6 +511,8 @@ export class ExpressionRendererRegistry implements IRegistry // // @public (undocumented) export interface ExpressionRenderError extends Error { + // (undocumented) + original?: Error; // (undocumented) type?: string; } @@ -1095,7 +1097,7 @@ export interface ReactExpressionRendererProps extends IExpressionLoaderParams { padding?: 'xs' | 's' | 'm' | 'l' | 'xl'; reload$?: Observable; // (undocumented) - renderError?: (error?: string | null) => React.ReactElement | React.ReactElement[]; + renderError?: (message?: string | null, error?: ExpressionRenderError | null) => React.ReactElement | React.ReactElement[]; } // Warning: (ae-missing-release-tag) "ReactExpressionRendererType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/src/plugins/expressions/public/react_expression_renderer.tsx b/src/plugins/expressions/public/react_expression_renderer.tsx index 12476c70044b5..99d170c96666d 100644 --- a/src/plugins/expressions/public/react_expression_renderer.tsx +++ b/src/plugins/expressions/public/react_expression_renderer.tsx @@ -35,7 +35,10 @@ export interface ReactExpressionRendererProps extends IExpressionLoaderParams { className?: string; dataAttrs?: string[]; expression: string | ExpressionAstExpression; - renderError?: (error?: string | null) => React.ReactElement | React.ReactElement[]; + renderError?: ( + message?: string | null, + error?: ExpressionRenderError | null + ) => React.ReactElement | React.ReactElement[]; padding?: 'xs' | 's' | 'm' | 'l' | 'xl'; onEvent?: (event: ExpressionRendererEvent) => void; /** @@ -186,7 +189,10 @@ export const ReactExpressionRenderer = ({

{state.isEmpty && } {state.isLoading && } - {!state.isLoading && state.error && renderError && renderError(state.error.message)} + {!state.isLoading && + state.error && + renderError && + renderError(state.error.message, state.error)}
{ + renderError={(errorMessage?: string | null, error?: ExpressionRenderError | null) => { + const visibleErrorMessage = getOriginalRequestErrorMessage(error) || errorMessage; return ( @@ -354,7 +357,7 @@ export const InnerVisualizationWrapper = ({ defaultMessage="An error occurred when loading data." /> - {errorMessage ? ( + {visibleErrorMessage ? ( { @@ -369,7 +372,7 @@ export const InnerVisualizationWrapper = ({ })} - {localState.expandError ? errorMessage : null} + {localState.expandError ? visibleErrorMessage : null} ) : null} diff --git a/x-pack/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx b/x-pack/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx index d0d2360ddc107..4fb0630a305e7 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/embeddable/expression_wrapper.tsx @@ -13,6 +13,7 @@ import { ReactExpressionRendererType, } from 'src/plugins/expressions/public'; import { ExecutionContextSearch } from 'src/plugins/expressions'; +import { getOriginalRequestErrorMessage } from '../error_helper'; export interface ExpressionWrapperProps { ExpressionRenderer: ReactExpressionRendererType; @@ -50,7 +51,20 @@ export function ExpressionWrapper({ padding="m" expression={expression} searchContext={searchContext} - renderError={(error) =>
{error}
} + renderError={(errorMessage, error) => ( +
+ + + + + + + {getOriginalRequestErrorMessage(error) || errorMessage} + + + +
+ )} onEvent={handleEvent} />
diff --git a/x-pack/plugins/lens/public/editor_frame_service/error_helper.ts b/x-pack/plugins/lens/public/editor_frame_service/error_helper.ts new file mode 100644 index 0000000000000..79faa5a47def3 --- /dev/null +++ b/x-pack/plugins/lens/public/editor_frame_service/error_helper.ts @@ -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 { i18n } from '@kbn/i18n'; + +import { ExpressionRenderError } from 'src/plugins/expressions/public'; + +interface ElasticsearchErrorClause { + type: string; + reason: string; + caused_by?: ElasticsearchErrorClause; +} + +interface RequestError extends Error { + body?: { attributes?: { error: ElasticsearchErrorClause } }; +} + +const isRequestError = (e: Error | RequestError): e is RequestError => { + if ('body' in e) { + return e.body?.attributes?.error?.caused_by !== undefined; + } + return false; +}; + +function getNestedErrorClause({ + type, + reason, + caused_by: causedBy, +}: ElasticsearchErrorClause): { type: string; reason: string } { + if (causedBy) { + return getNestedErrorClause(causedBy); + } + return { type, reason }; +} + +export function getOriginalRequestErrorMessage(error?: ExpressionRenderError | null) { + if (error && 'original' in error && error.original && isRequestError(error.original)) { + const rootError = getNestedErrorClause(error.original.body!.attributes!.error); + if (rootError.reason && rootError.type) { + return i18n.translate('xpack.lens.editorFrame.expressionFailureMessage', { + defaultMessage: 'Request error: {type}, {reason}', + values: { + reason: rootError.reason, + type: rootError.type, + }, + }); + } + } +} From e0bb8605b420f6202bd9bc5dd813706dbf34f153 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Tue, 13 Oct 2020 09:32:49 -0400 Subject: [PATCH 37/85] Apply back pressure in Task Manager whenever Elasticsearch responds with a 429 (#75666) * Make task manager maxWorkers and pollInterval observables (#75293) * WIP step 1 * WIP step 2 * Cleanup * Make maxWorkers an observable for the task pool * Cleanup * Fix test failures * Use BehaviorSubject * Add some tests * Make the task manager store emit error events (#75679) * Add errors$ observable to the task store * Add unit tests * Temporarily apply back pressure to maxWorkers and pollInterval when 429 errors occur (#77096) * WIP * Cleanup * Add error count to message * Reset observable values on stop * Add comments * Fix issues when changing configurations * Cleanup code * Cleanup pt2 * Some renames * Fix typecheck * Use observables to manage throughput * Rename class * Switch to createManagedConfiguration * Add some comments * Start unit tests * Add logs * Fix log level * Attempt at adding integration tests * Fix test failures * Fix timer * Revert "Fix timer" This reverts commit 0817e5e6a5ef9bdfe9329a559f4a5674ebbbef24. * Use Symbol * Fix merge scan * replace startsWith with a timer that is scheduled to 0 * typo Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Gidi Meir Morris --- .../managed_configuration.test.ts | 105 ++++++++ .../lib/create_managed_configuration.test.ts | 213 ++++++++++++++++ .../lib/create_managed_configuration.ts | 160 ++++++++++++ .../server/polling/observable_monitor.ts | 6 +- .../server/polling/task_poller.test.ts | 85 ++++++- .../server/polling/task_poller.ts | 21 +- .../task_manager/server/task_manager.ts | 13 +- .../task_manager/server/task_pool.test.ts | 41 ++-- .../plugins/task_manager/server/task_pool.ts | 10 +- .../task_manager/server/task_store.test.ts | 229 ++++++++++++++---- .../plugins/task_manager/server/task_store.ts | 119 ++++++--- 11 files changed, 882 insertions(+), 120 deletions(-) create mode 100644 x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts create mode 100644 x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts create mode 100644 x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts diff --git a/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts b/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts new file mode 100644 index 0000000000000..443c811469002 --- /dev/null +++ b/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts @@ -0,0 +1,105 @@ +/* + * 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 sinon from 'sinon'; +import { mockLogger } from '../test_utils'; +import { TaskManager } from '../task_manager'; +import { savedObjectsRepositoryMock } from '../../../../../src/core/server/mocks'; +import { + SavedObjectsSerializer, + SavedObjectTypeRegistry, + SavedObjectsErrorHelpers, +} from '../../../../../src/core/server'; +import { ADJUST_THROUGHPUT_INTERVAL } from '../lib/create_managed_configuration'; + +describe('managed configuration', () => { + let taskManager: TaskManager; + let clock: sinon.SinonFakeTimers; + const callAsInternalUser = jest.fn(); + const logger = mockLogger(); + const serializer = new SavedObjectsSerializer(new SavedObjectTypeRegistry()); + const savedObjectsClient = savedObjectsRepositoryMock.create(); + const config = { + enabled: true, + max_workers: 10, + index: 'foo', + max_attempts: 9, + poll_interval: 3000, + max_poll_inactivity_cycles: 10, + request_capacity: 1000, + }; + + beforeEach(() => { + jest.resetAllMocks(); + callAsInternalUser.mockResolvedValue({ total: 0, updated: 0, version_conflicts: 0 }); + clock = sinon.useFakeTimers(); + taskManager = new TaskManager({ + config, + logger, + serializer, + callAsInternalUser, + taskManagerId: 'some-uuid', + savedObjectsRepository: savedObjectsClient, + }); + taskManager.registerTaskDefinitions({ + foo: { + type: 'foo', + title: 'Foo', + createTaskRunner: jest.fn(), + }, + }); + taskManager.start(); + // force rxjs timers to fire when they are scheduled for setTimeout(0) as the + // sinon fake timers cause them to stall + clock.tick(0); + }); + + afterEach(() => clock.restore()); + + test('should lower max workers when Elasticsearch returns 429 error', async () => { + savedObjectsClient.create.mockRejectedValueOnce( + SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b') + ); + // Cause "too many requests" error to be thrown + await expect( + taskManager.schedule({ + taskType: 'foo', + state: {}, + params: {}, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Too Many Requests"`); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + expect(logger.warn).toHaveBeenCalledWith( + 'Max workers configuration is temporarily reduced after Elasticsearch returned 1 "too many request" error(s).' + ); + expect(logger.debug).toHaveBeenCalledWith( + 'Max workers configuration changing from 10 to 8 after seeing 1 error(s)' + ); + expect(logger.debug).toHaveBeenCalledWith('Task pool now using 10 as the max worker value'); + }); + + test('should increase poll interval when Elasticsearch returns 429 error', async () => { + savedObjectsClient.create.mockRejectedValueOnce( + SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b') + ); + // Cause "too many requests" error to be thrown + await expect( + taskManager.schedule({ + taskType: 'foo', + state: {}, + params: {}, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Too Many Requests"`); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + expect(logger.warn).toHaveBeenCalledWith( + 'Poll interval configuration is temporarily increased after Elasticsearch returned 1 "too many request" error(s).' + ); + expect(logger.debug).toHaveBeenCalledWith( + 'Poll interval configuration changing from 3000 to 3600 after seeing 1 error(s)' + ); + expect(logger.debug).toHaveBeenCalledWith('Task poller now using interval of 3600ms'); + }); +}); diff --git a/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts new file mode 100644 index 0000000000000..b6b5cd003c5d4 --- /dev/null +++ b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts @@ -0,0 +1,213 @@ +/* + * 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 sinon from 'sinon'; +import { Subject } from 'rxjs'; +import { mockLogger } from '../test_utils'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; +import { + createManagedConfiguration, + ADJUST_THROUGHPUT_INTERVAL, +} from './create_managed_configuration'; + +describe('createManagedConfiguration()', () => { + let clock: sinon.SinonFakeTimers; + const logger = mockLogger(); + + beforeEach(() => { + jest.resetAllMocks(); + clock = sinon.useFakeTimers(); + }); + + afterEach(() => clock.restore()); + + test('returns observables with initialized values', async () => { + const maxWorkersSubscription = jest.fn(); + const pollIntervalSubscription = jest.fn(); + const { maxWorkersConfiguration$, pollIntervalConfiguration$ } = createManagedConfiguration({ + logger, + errors$: new Subject(), + startingMaxWorkers: 1, + startingPollInterval: 2, + }); + maxWorkersConfiguration$.subscribe(maxWorkersSubscription); + pollIntervalConfiguration$.subscribe(pollIntervalSubscription); + expect(maxWorkersSubscription).toHaveBeenCalledTimes(1); + expect(maxWorkersSubscription).toHaveBeenNthCalledWith(1, 1); + expect(pollIntervalSubscription).toHaveBeenCalledTimes(1); + expect(pollIntervalSubscription).toHaveBeenNthCalledWith(1, 2); + }); + + test(`skips errors that aren't about too many requests`, async () => { + const maxWorkersSubscription = jest.fn(); + const pollIntervalSubscription = jest.fn(); + const errors$ = new Subject(); + const { maxWorkersConfiguration$, pollIntervalConfiguration$ } = createManagedConfiguration({ + errors$, + logger, + startingMaxWorkers: 100, + startingPollInterval: 100, + }); + maxWorkersConfiguration$.subscribe(maxWorkersSubscription); + pollIntervalConfiguration$.subscribe(pollIntervalSubscription); + errors$.next(new Error('foo')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + expect(maxWorkersSubscription).toHaveBeenCalledTimes(1); + expect(pollIntervalSubscription).toHaveBeenCalledTimes(1); + }); + + describe('maxWorker configuration', () => { + function setupScenario(startingMaxWorkers: number) { + const errors$ = new Subject(); + const subscription = jest.fn(); + const { maxWorkersConfiguration$ } = createManagedConfiguration({ + errors$, + startingMaxWorkers, + logger, + startingPollInterval: 1, + }); + maxWorkersConfiguration$.subscribe(subscription); + return { subscription, errors$ }; + } + + beforeEach(() => { + jest.resetAllMocks(); + clock = sinon.useFakeTimers(); + }); + + afterEach(() => clock.restore()); + + test('should decrease configuration at the next interval when an error is emitted', async () => { + const { subscription, errors$ } = setupScenario(100); + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL - 1); + expect(subscription).toHaveBeenCalledTimes(1); + clock.tick(1); + expect(subscription).toHaveBeenCalledTimes(2); + expect(subscription).toHaveBeenNthCalledWith(2, 80); + }); + + test('should log a warning when the configuration changes from the starting value', async () => { + const { errors$ } = setupScenario(100); + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + expect(logger.warn).toHaveBeenCalledWith( + 'Max workers configuration is temporarily reduced after Elasticsearch returned 1 "too many request" error(s).' + ); + }); + + test('should increase configuration back to normal incrementally after an error is emitted', async () => { + const { subscription, errors$ } = setupScenario(100); + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL * 10); + expect(subscription).toHaveBeenNthCalledWith(2, 80); + expect(subscription).toHaveBeenNthCalledWith(3, 84); + // 88.2- > 89 from Math.ceil + expect(subscription).toHaveBeenNthCalledWith(4, 89); + expect(subscription).toHaveBeenNthCalledWith(5, 94); + expect(subscription).toHaveBeenNthCalledWith(6, 99); + // 103.95 -> 100 from Math.min with starting value + expect(subscription).toHaveBeenNthCalledWith(7, 100); + // No new calls due to value not changing and usage of distinctUntilChanged() + expect(subscription).toHaveBeenCalledTimes(7); + }); + + test('should keep reducing configuration when errors keep emitting', async () => { + const { subscription, errors$ } = setupScenario(100); + for (let i = 0; i < 20; i++) { + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + } + expect(subscription).toHaveBeenNthCalledWith(2, 80); + expect(subscription).toHaveBeenNthCalledWith(3, 64); + // 51.2 -> 51 from Math.floor + expect(subscription).toHaveBeenNthCalledWith(4, 51); + expect(subscription).toHaveBeenNthCalledWith(5, 40); + expect(subscription).toHaveBeenNthCalledWith(6, 32); + expect(subscription).toHaveBeenNthCalledWith(7, 25); + expect(subscription).toHaveBeenNthCalledWith(8, 20); + expect(subscription).toHaveBeenNthCalledWith(9, 16); + expect(subscription).toHaveBeenNthCalledWith(10, 12); + expect(subscription).toHaveBeenNthCalledWith(11, 9); + expect(subscription).toHaveBeenNthCalledWith(12, 7); + expect(subscription).toHaveBeenNthCalledWith(13, 5); + expect(subscription).toHaveBeenNthCalledWith(14, 4); + expect(subscription).toHaveBeenNthCalledWith(15, 3); + expect(subscription).toHaveBeenNthCalledWith(16, 2); + expect(subscription).toHaveBeenNthCalledWith(17, 1); + // No new calls due to value not changing and usage of distinctUntilChanged() + expect(subscription).toHaveBeenCalledTimes(17); + }); + }); + + describe('pollInterval configuration', () => { + function setupScenario(startingPollInterval: number) { + const errors$ = new Subject(); + const subscription = jest.fn(); + const { pollIntervalConfiguration$ } = createManagedConfiguration({ + logger, + errors$, + startingPollInterval, + startingMaxWorkers: 1, + }); + pollIntervalConfiguration$.subscribe(subscription); + return { subscription, errors$ }; + } + + beforeEach(() => { + jest.resetAllMocks(); + clock = sinon.useFakeTimers(); + }); + + afterEach(() => clock.restore()); + + test('should increase configuration at the next interval when an error is emitted', async () => { + const { subscription, errors$ } = setupScenario(100); + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL - 1); + expect(subscription).toHaveBeenCalledTimes(1); + clock.tick(1); + expect(subscription).toHaveBeenCalledTimes(2); + expect(subscription).toHaveBeenNthCalledWith(2, 120); + }); + + test('should log a warning when the configuration changes from the starting value', async () => { + const { errors$ } = setupScenario(100); + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + expect(logger.warn).toHaveBeenCalledWith( + 'Poll interval configuration is temporarily increased after Elasticsearch returned 1 "too many request" error(s).' + ); + }); + + test('should decrease configuration back to normal incrementally after an error is emitted', async () => { + const { subscription, errors$ } = setupScenario(100); + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL * 10); + expect(subscription).toHaveBeenNthCalledWith(2, 120); + expect(subscription).toHaveBeenNthCalledWith(3, 114); + // 108.3 -> 108 from Math.floor + expect(subscription).toHaveBeenNthCalledWith(4, 108); + expect(subscription).toHaveBeenNthCalledWith(5, 102); + // 96.9 -> 100 from Math.max with the starting value + expect(subscription).toHaveBeenNthCalledWith(6, 100); + // No new calls due to value not changing and usage of distinctUntilChanged() + expect(subscription).toHaveBeenCalledTimes(6); + }); + + test('should increase configuration when errors keep emitting', async () => { + const { subscription, errors$ } = setupScenario(100); + for (let i = 0; i < 3; i++) { + errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + clock.tick(ADJUST_THROUGHPUT_INTERVAL); + } + expect(subscription).toHaveBeenNthCalledWith(2, 120); + expect(subscription).toHaveBeenNthCalledWith(3, 144); + // 172.8 -> 173 from Math.ceil + expect(subscription).toHaveBeenNthCalledWith(4, 173); + }); + }); +}); diff --git a/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts new file mode 100644 index 0000000000000..3dc5fd50d3ca4 --- /dev/null +++ b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts @@ -0,0 +1,160 @@ +/* + * 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 { interval, merge, of, Observable } from 'rxjs'; +import { filter, mergeScan, map, scan, distinctUntilChanged, startWith } from 'rxjs/operators'; +import { SavedObjectsErrorHelpers } from '../../../../../src/core/server'; +import { Logger } from '../types'; + +const FLUSH_MARKER = Symbol('flush'); +export const ADJUST_THROUGHPUT_INTERVAL = 10 * 1000; + +// When errors occur, reduce maxWorkers by MAX_WORKERS_DECREASE_PERCENTAGE +// When errors no longer occur, start increasing maxWorkers by MAX_WORKERS_INCREASE_PERCENTAGE +// until starting value is reached +const MAX_WORKERS_DECREASE_PERCENTAGE = 0.8; +const MAX_WORKERS_INCREASE_PERCENTAGE = 1.05; + +// When errors occur, increase pollInterval by POLL_INTERVAL_INCREASE_PERCENTAGE +// When errors no longer occur, start decreasing pollInterval by POLL_INTERVAL_DECREASE_PERCENTAGE +// until starting value is reached +const POLL_INTERVAL_DECREASE_PERCENTAGE = 0.95; +const POLL_INTERVAL_INCREASE_PERCENTAGE = 1.2; + +interface ManagedConfigurationOpts { + logger: Logger; + startingMaxWorkers: number; + startingPollInterval: number; + errors$: Observable; +} + +interface ManagedConfiguration { + maxWorkersConfiguration$: Observable; + pollIntervalConfiguration$: Observable; +} + +export function createManagedConfiguration({ + logger, + startingMaxWorkers, + startingPollInterval, + errors$, +}: ManagedConfigurationOpts): ManagedConfiguration { + const errorCheck$ = countErrors(errors$, ADJUST_THROUGHPUT_INTERVAL); + return { + maxWorkersConfiguration$: errorCheck$.pipe( + createMaxWorkersScan(logger, startingMaxWorkers), + startWith(startingMaxWorkers), + distinctUntilChanged() + ), + pollIntervalConfiguration$: errorCheck$.pipe( + createPollIntervalScan(logger, startingPollInterval), + startWith(startingPollInterval), + distinctUntilChanged() + ), + }; +} + +function createMaxWorkersScan(logger: Logger, startingMaxWorkers: number) { + return scan((previousMaxWorkers: number, errorCount: number) => { + let newMaxWorkers: number; + if (errorCount > 0) { + // Decrease max workers by MAX_WORKERS_DECREASE_PERCENTAGE while making sure it doesn't go lower than 1. + // Using Math.floor to make sure the number is different than previous while not being a decimal value. + newMaxWorkers = Math.max(Math.floor(previousMaxWorkers * MAX_WORKERS_DECREASE_PERCENTAGE), 1); + } else { + // Increase max workers by MAX_WORKERS_INCREASE_PERCENTAGE while making sure it doesn't go + // higher than the starting value. Using Math.ceil to make sure the number is different than + // previous while not being a decimal value + newMaxWorkers = Math.min( + startingMaxWorkers, + Math.ceil(previousMaxWorkers * MAX_WORKERS_INCREASE_PERCENTAGE) + ); + } + if (newMaxWorkers !== previousMaxWorkers) { + logger.debug( + `Max workers configuration changing from ${previousMaxWorkers} to ${newMaxWorkers} after seeing ${errorCount} error(s)` + ); + if (previousMaxWorkers === startingMaxWorkers) { + logger.warn( + `Max workers configuration is temporarily reduced after Elasticsearch returned ${errorCount} "too many request" error(s).` + ); + } + } + return newMaxWorkers; + }, startingMaxWorkers); +} + +function createPollIntervalScan(logger: Logger, startingPollInterval: number) { + return scan((previousPollInterval: number, errorCount: number) => { + let newPollInterval: number; + if (errorCount > 0) { + // Increase poll interval by POLL_INTERVAL_INCREASE_PERCENTAGE and use Math.ceil to + // make sure the number is different than previous while not being a decimal value. + newPollInterval = Math.ceil(previousPollInterval * POLL_INTERVAL_INCREASE_PERCENTAGE); + } else { + // Decrease poll interval by POLL_INTERVAL_DECREASE_PERCENTAGE and use Math.floor to + // make sure the number is different than previous while not being a decimal value. + newPollInterval = Math.max( + startingPollInterval, + Math.floor(previousPollInterval * POLL_INTERVAL_DECREASE_PERCENTAGE) + ); + } + if (newPollInterval !== previousPollInterval) { + logger.debug( + `Poll interval configuration changing from ${previousPollInterval} to ${newPollInterval} after seeing ${errorCount} error(s)` + ); + if (previousPollInterval === startingPollInterval) { + logger.warn( + `Poll interval configuration is temporarily increased after Elasticsearch returned ${errorCount} "too many request" error(s).` + ); + } + } + return newPollInterval; + }, startingPollInterval); +} + +function countErrors(errors$: Observable, countInterval: number): Observable { + return merge( + // Flush error count at fixed interval + interval(countInterval).pipe(map(() => FLUSH_MARKER)), + errors$.pipe(filter((e) => SavedObjectsErrorHelpers.isTooManyRequestsError(e))) + ).pipe( + // When tag is "flush", reset the error counter + // Otherwise increment the error counter + mergeScan(({ count }, next) => { + return next === FLUSH_MARKER + ? of(emitErrorCount(count), resetErrorCount()) + : of(incementErrorCount(count)); + }, emitErrorCount(0)), + filter(isEmitEvent), + map(({ count }) => count) + ); +} + +function emitErrorCount(count: number) { + return { + tag: 'emit', + count, + }; +} + +function isEmitEvent(event: { tag: string; count: number }) { + return event.tag === 'emit'; +} + +function incementErrorCount(count: number) { + return { + tag: 'inc', + count: count + 1, + }; +} + +function resetErrorCount() { + return { + tag: 'initial', + count: 0, + }; +} diff --git a/x-pack/plugins/task_manager/server/polling/observable_monitor.ts b/x-pack/plugins/task_manager/server/polling/observable_monitor.ts index 7b06117ef59d1..b07bb6661163b 100644 --- a/x-pack/plugins/task_manager/server/polling/observable_monitor.ts +++ b/x-pack/plugins/task_manager/server/polling/observable_monitor.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Subject, Observable, throwError, interval, timer, Subscription } from 'rxjs'; -import { exhaustMap, tap, takeUntil, switchMap, switchMapTo, catchError } from 'rxjs/operators'; +import { Subject, Observable, throwError, timer, Subscription } from 'rxjs'; import { noop } from 'lodash'; +import { exhaustMap, tap, takeUntil, switchMap, switchMapTo, catchError } from 'rxjs/operators'; const DEFAULT_HEARTBEAT_INTERVAL = 1000; @@ -29,7 +29,7 @@ export function createObservableMonitor( }: ObservableMonitorOptions = {} ): Observable { return new Observable((subscriber) => { - const subscription: Subscription = interval(heartbeatInterval) + const subscription: Subscription = timer(0, heartbeatInterval) .pipe( // switch from the heartbeat interval to the instantiated observable until it completes / errors exhaustMap(() => takeUntilDurationOfInactivity(observableFactory(), inactivityTimeout)), diff --git a/x-pack/plugins/task_manager/server/polling/task_poller.test.ts b/x-pack/plugins/task_manager/server/polling/task_poller.test.ts index 607e2ac2b80fa..956c8b05f3860 100644 --- a/x-pack/plugins/task_manager/server/polling/task_poller.test.ts +++ b/x-pack/plugins/task_manager/server/polling/task_poller.test.ts @@ -5,11 +5,11 @@ */ import _ from 'lodash'; -import { Subject } from 'rxjs'; +import { Subject, of, BehaviorSubject } from 'rxjs'; import { Option, none, some } from 'fp-ts/lib/Option'; import { createTaskPoller, PollingError, PollingErrorType } from './task_poller'; import { fakeSchedulers } from 'rxjs-marbles/jest'; -import { sleep, resolvable, Resolvable } from '../test_utils'; +import { sleep, resolvable, Resolvable, mockLogger } from '../test_utils'; import { asOk, asErr } from '../lib/result_type'; describe('TaskPoller', () => { @@ -24,10 +24,12 @@ describe('TaskPoller', () => { const work = jest.fn(async () => true); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, getCapacity: () => 1, work, + workTimeout: pollInterval * 5, pollRequests$: new Subject>(), }).subscribe(() => {}); @@ -40,9 +42,52 @@ describe('TaskPoller', () => { await sleep(0); expect(work).toHaveBeenCalledTimes(1); + await sleep(0); + await sleep(0); + advance(pollInterval + 10); + await sleep(0); + expect(work).toHaveBeenCalledTimes(2); + }) + ); + + test( + 'poller adapts to pollInterval changes', + fakeSchedulers(async (advance) => { + const pollInterval = 100; + const pollInterval$ = new BehaviorSubject(pollInterval); + const bufferCapacity = 5; + + const work = jest.fn(async () => true); + createTaskPoller({ + logger: mockLogger(), + pollInterval$, + bufferCapacity, + getCapacity: () => 1, + work, + workTimeout: pollInterval * 5, + pollRequests$: new Subject>(), + }).subscribe(() => {}); + + // `work` is async, we have to force a node `tick` await sleep(0); advance(pollInterval); + expect(work).toHaveBeenCalledTimes(1); + + pollInterval$.next(pollInterval * 2); + + // `work` is async, we have to force a node `tick` + await sleep(0); + advance(pollInterval); + expect(work).toHaveBeenCalledTimes(1); + advance(pollInterval); expect(work).toHaveBeenCalledTimes(2); + + pollInterval$.next(pollInterval / 2); + + // `work` is async, we have to force a node `tick` + await sleep(0); + advance(pollInterval / 2); + expect(work).toHaveBeenCalledTimes(3); }) ); @@ -56,9 +101,11 @@ describe('TaskPoller', () => { let hasCapacity = true; createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work, + workTimeout: pollInterval * 5, getCapacity: () => (hasCapacity ? 1 : 0), pollRequests$: new Subject>(), }).subscribe(() => {}); @@ -113,9 +160,11 @@ describe('TaskPoller', () => { const work = jest.fn(async () => true); const pollRequests$ = new Subject>(); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work, + workTimeout: pollInterval * 5, getCapacity: () => 1, pollRequests$, }).subscribe(jest.fn()); @@ -157,9 +206,11 @@ describe('TaskPoller', () => { const work = jest.fn(async () => true); const pollRequests$ = new Subject>(); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work, + workTimeout: pollInterval * 5, getCapacity: () => (hasCapacity ? 1 : 0), pollRequests$, }).subscribe(() => {}); @@ -200,9 +251,11 @@ describe('TaskPoller', () => { const work = jest.fn(async () => true); const pollRequests$ = new Subject>(); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work, + workTimeout: pollInterval * 5, getCapacity: () => 1, pollRequests$, }).subscribe(() => {}); @@ -235,7 +288,8 @@ describe('TaskPoller', () => { const handler = jest.fn(); const pollRequests$ = new Subject>(); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work: async (...args) => { await worker; @@ -285,7 +339,8 @@ describe('TaskPoller', () => { type ResolvableTupple = [string, PromiseLike & Resolvable]; const pollRequests$ = new Subject>(); createTaskPoller<[string, Resolvable], string[]>({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work: async (...resolvables) => { await Promise.all(resolvables.map(([, future]) => future)); @@ -344,11 +399,13 @@ describe('TaskPoller', () => { const handler = jest.fn(); const pollRequests$ = new Subject>(); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work: async (...args) => { throw new Error('failed to work'); }, + workTimeout: pollInterval * 5, getCapacity: () => 5, pollRequests$, }).subscribe(handler); @@ -383,9 +440,11 @@ describe('TaskPoller', () => { return callCount; }); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work, + workTimeout: pollInterval * 5, getCapacity: () => 5, pollRequests$, }).subscribe(handler); @@ -424,9 +483,11 @@ describe('TaskPoller', () => { const work = jest.fn(async () => {}); const pollRequests$ = new Subject>(); createTaskPoller({ - pollInterval, + logger: mockLogger(), + pollInterval$: of(pollInterval), bufferCapacity, work, + workTimeout: pollInterval * 5, getCapacity: () => 5, pollRequests$, }).subscribe(handler); diff --git a/x-pack/plugins/task_manager/server/polling/task_poller.ts b/x-pack/plugins/task_manager/server/polling/task_poller.ts index a1435ffafe8f8..7515668a19d40 100644 --- a/x-pack/plugins/task_manager/server/polling/task_poller.ts +++ b/x-pack/plugins/task_manager/server/polling/task_poller.ts @@ -11,10 +11,11 @@ import { performance } from 'perf_hooks'; import { after } from 'lodash'; import { Subject, merge, interval, of, Observable } from 'rxjs'; -import { mapTo, filter, scan, concatMap, tap, catchError } from 'rxjs/operators'; +import { mapTo, filter, scan, concatMap, tap, catchError, switchMap } from 'rxjs/operators'; import { pipe } from 'fp-ts/lib/pipeable'; import { Option, none, map as mapOptional, getOrElse } from 'fp-ts/lib/Option'; +import { Logger } from '../types'; import { pullFromSet } from '../lib/pull_from_set'; import { Result, @@ -30,12 +31,13 @@ import { timeoutPromiseAfter } from './timeout_promise_after'; type WorkFn = (...params: T[]) => Promise; interface Opts { - pollInterval: number; + logger: Logger; + pollInterval$: Observable; bufferCapacity: number; getCapacity: () => number; pollRequests$: Observable>; work: WorkFn; - workTimeout?: number; + workTimeout: number; } /** @@ -52,7 +54,8 @@ interface Opts { * of unique request argumets of type T. The queue holds all the buffered request arguments streamed in via pollRequests$ */ export function createTaskPoller({ - pollInterval, + logger, + pollInterval$, getCapacity, pollRequests$, bufferCapacity, @@ -67,7 +70,13 @@ export function createTaskPoller({ // emit a polling event on demand pollRequests$, // emit a polling event on a fixed interval - interval(pollInterval).pipe(mapTo(none)) + pollInterval$.pipe( + switchMap((period) => { + logger.debug(`Task poller now using interval of ${period}ms`); + return interval(period); + }), + mapTo(none) + ) ).pipe( // buffer all requests in a single set (to remove duplicates) as we don't want // work to take place in parallel (it could cause Task Manager to pull in the same @@ -95,7 +104,7 @@ export function createTaskPoller({ await promiseResult( timeoutPromiseAfter( work(...pullFromSet(set, getCapacity())), - workTimeout ?? pollInterval, + workTimeout, () => new Error(`work has timed out`) ) ), diff --git a/x-pack/plugins/task_manager/server/task_manager.ts b/x-pack/plugins/task_manager/server/task_manager.ts index fb2d5e07030a4..cc611e124ea7b 100644 --- a/x-pack/plugins/task_manager/server/task_manager.ts +++ b/x-pack/plugins/task_manager/server/task_manager.ts @@ -17,6 +17,7 @@ import { ISavedObjectsRepository, } from '../../../../src/core/server'; import { Result, asOk, asErr, either, map, mapErr, promiseResult } from './lib/result_type'; +import { createManagedConfiguration } from './lib/create_managed_configuration'; import { TaskManagerConfig } from './config'; import { Logger } from './types'; @@ -149,6 +150,13 @@ export class TaskManager { // pipe store events into the TaskManager's event stream this.store.events.subscribe((event) => this.events$.next(event)); + const { maxWorkersConfiguration$, pollIntervalConfiguration$ } = createManagedConfiguration({ + logger: this.logger, + errors$: this.store.errors$, + startingMaxWorkers: opts.config.max_workers, + startingPollInterval: opts.config.poll_interval, + }); + this.bufferedStore = new BufferedTaskStore(this.store, { bufferMaxOperations: opts.config.max_workers, logger: this.logger, @@ -156,7 +164,7 @@ export class TaskManager { this.pool = new TaskPool({ logger: this.logger, - maxWorkers: opts.config.max_workers, + maxWorkers$: maxWorkersConfiguration$, }); const { @@ -166,7 +174,8 @@ export class TaskManager { this.poller$ = createObservableMonitor>, Error>( () => createTaskPoller({ - pollInterval, + logger: this.logger, + pollInterval$: pollIntervalConfiguration$, bufferCapacity: opts.config.request_capacity, getCapacity: () => this.pool.availableWorkers, pollRequests$: this.claimRequests$, diff --git a/x-pack/plugins/task_manager/server/task_pool.test.ts b/x-pack/plugins/task_manager/server/task_pool.test.ts index 8b2bce455589e..12b731b2b78ae 100644 --- a/x-pack/plugins/task_manager/server/task_pool.test.ts +++ b/x-pack/plugins/task_manager/server/task_pool.test.ts @@ -5,6 +5,7 @@ */ import sinon from 'sinon'; +import { of, Subject } from 'rxjs'; import { TaskPool, TaskPoolRunResult } from './task_pool'; import { mockLogger, resolvable, sleep } from './test_utils'; import { asOk } from './lib/result_type'; @@ -14,7 +15,7 @@ import moment from 'moment'; describe('TaskPool', () => { test('occupiedWorkers are a sum of running tasks', async () => { const pool = new TaskPool({ - maxWorkers: 200, + maxWorkers$: of(200), logger: mockLogger(), }); @@ -26,7 +27,7 @@ describe('TaskPool', () => { test('availableWorkers are a function of total_capacity - occupiedWorkers', async () => { const pool = new TaskPool({ - maxWorkers: 10, + maxWorkers$: of(10), logger: mockLogger(), }); @@ -36,9 +37,21 @@ describe('TaskPool', () => { expect(pool.availableWorkers).toEqual(7); }); + test('availableWorkers is 0 until maxWorkers$ pushes a value', async () => { + const maxWorkers$ = new Subject(); + const pool = new TaskPool({ + maxWorkers$, + logger: mockLogger(), + }); + + expect(pool.availableWorkers).toEqual(0); + maxWorkers$.next(10); + expect(pool.availableWorkers).toEqual(10); + }); + test('does not run tasks that are beyond its available capacity', async () => { const pool = new TaskPool({ - maxWorkers: 2, + maxWorkers$: of(2), logger: mockLogger(), }); @@ -60,7 +73,7 @@ describe('TaskPool', () => { test('should log when marking a Task as running fails', async () => { const logger = mockLogger(); const pool = new TaskPool({ - maxWorkers: 2, + maxWorkers$: of(2), logger, }); @@ -83,7 +96,7 @@ describe('TaskPool', () => { test('should log when running a Task fails', async () => { const logger = mockLogger(); const pool = new TaskPool({ - maxWorkers: 3, + maxWorkers$: of(3), logger, }); @@ -106,7 +119,7 @@ describe('TaskPool', () => { test('should not log when running a Task fails due to the Task SO having been deleted while in flight', async () => { const logger = mockLogger(); const pool = new TaskPool({ - maxWorkers: 3, + maxWorkers$: of(3), logger, }); @@ -117,11 +130,9 @@ describe('TaskPool', () => { const result = await pool.run([mockTask(), taskFailedToRun, mockTask()]); - expect(logger.debug.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "Task TaskType \\"shooooo\\" failed in attempt to run: Saved object [task/foo] not found", - ] - `); + expect(logger.debug).toHaveBeenCalledWith( + 'Task TaskType "shooooo" failed in attempt to run: Saved object [task/foo] not found' + ); expect(logger.warn).not.toHaveBeenCalled(); expect(result).toEqual(TaskPoolRunResult.RunningAllClaimedTasks); @@ -130,7 +141,7 @@ describe('TaskPool', () => { test('Running a task which fails still takes up capacity', async () => { const logger = mockLogger(); const pool = new TaskPool({ - maxWorkers: 1, + maxWorkers$: of(1), logger, }); @@ -147,7 +158,7 @@ describe('TaskPool', () => { test('clears up capacity when a task completes', async () => { const pool = new TaskPool({ - maxWorkers: 1, + maxWorkers$: of(1), logger: mockLogger(), }); @@ -193,7 +204,7 @@ describe('TaskPool', () => { test('run cancels expired tasks prior to running new tasks', async () => { const logger = mockLogger(); const pool = new TaskPool({ - maxWorkers: 2, + maxWorkers$: of(2), logger, }); @@ -251,7 +262,7 @@ describe('TaskPool', () => { const logger = mockLogger(); const pool = new TaskPool({ logger, - maxWorkers: 20, + maxWorkers$: of(20), }); const cancelled = resolvable(); diff --git a/x-pack/plugins/task_manager/server/task_pool.ts b/x-pack/plugins/task_manager/server/task_pool.ts index 92374908c60f7..44f5f5648c2ac 100644 --- a/x-pack/plugins/task_manager/server/task_pool.ts +++ b/x-pack/plugins/task_manager/server/task_pool.ts @@ -8,6 +8,7 @@ * This module contains the logic that ensures we don't run too many * tasks at once in a given Kibana instance. */ +import { Observable } from 'rxjs'; import moment, { Duration } from 'moment'; import { performance } from 'perf_hooks'; import { padStart } from 'lodash'; @@ -16,7 +17,7 @@ import { TaskRunner } from './task_runner'; import { isTaskSavedObjectNotFoundError } from './lib/is_task_not_found_error'; interface Opts { - maxWorkers: number; + maxWorkers$: Observable; logger: Logger; } @@ -31,7 +32,7 @@ const VERSION_CONFLICT_MESSAGE = 'Task has been claimed by another Kibana servic * Runs tasks in batches, taking costs into account. */ export class TaskPool { - private maxWorkers: number; + private maxWorkers: number = 0; private running = new Set(); private logger: Logger; @@ -44,8 +45,11 @@ export class TaskPool { * @prop {Logger} logger - The task manager logger. */ constructor(opts: Opts) { - this.maxWorkers = opts.maxWorkers; this.logger = opts.logger; + opts.maxWorkers$.subscribe((maxWorkers) => { + this.logger.debug(`Task pool now using ${maxWorkers} as the max worker value`); + this.maxWorkers = maxWorkers; + }); } /** diff --git a/x-pack/plugins/task_manager/server/task_store.test.ts b/x-pack/plugins/task_manager/server/task_store.test.ts index f5fafe83748d9..5a3ee12d593c9 100644 --- a/x-pack/plugins/task_manager/server/task_store.test.ts +++ b/x-pack/plugins/task_manager/server/task_store.test.ts @@ -7,7 +7,7 @@ import _ from 'lodash'; import sinon from 'sinon'; import uuid from 'uuid'; -import { filter, take } from 'rxjs/operators'; +import { filter, take, first } from 'rxjs/operators'; import { Option, some, none } from 'fp-ts/lib/Option'; import { @@ -66,8 +66,21 @@ const mockedDate = new Date('2019-02-12T21:01:22.479Z'); describe('TaskStore', () => { describe('schedule', () => { + let store: TaskStore; + + beforeAll(() => { + store = new TaskStore({ + index: 'tasky', + taskManagerId: '', + serializer, + callCluster: jest.fn(), + maxAttempts: 2, + definitions: taskDefinitions, + savedObjectsRepository: savedObjectsClient, + }); + }); + async function testSchedule(task: unknown) { - const callCluster = jest.fn(); savedObjectsClient.create.mockImplementation(async (type: string, attributes: unknown) => ({ id: 'testid', type, @@ -75,15 +88,6 @@ describe('TaskStore', () => { references: [], version: '123', })); - const store = new TaskStore({ - index: 'tasky', - taskManagerId: '', - serializer, - callCluster, - maxAttempts: 2, - definitions: taskDefinitions, - savedObjectsRepository: savedObjectsClient, - }); const result = await store.schedule(task as TaskInstance); expect(savedObjectsClient.create).toHaveBeenCalledTimes(1); @@ -176,12 +180,28 @@ describe('TaskStore', () => { /Unsupported task type "nope"/i ); }); + + test('pushes error from saved objects client to errors$', async () => { + const task: TaskInstance = { + id: 'id', + params: { hello: 'world' }, + state: { foo: 'bar' }, + taskType: 'report', + }; + + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + savedObjectsClient.create.mockRejectedValue(new Error('Failure')); + await expect(store.schedule(task)).rejects.toThrowErrorMatchingInlineSnapshot(`"Failure"`); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); }); describe('fetch', () => { - async function testFetch(opts?: SearchOpts, hits: unknown[] = []) { - const callCluster = sinon.spy(async (name: string, params?: unknown) => ({ hits: { hits } })); - const store = new TaskStore({ + let store: TaskStore; + const callCluster = jest.fn(); + + beforeAll(() => { + store = new TaskStore({ index: 'tasky', taskManagerId: '', serializer, @@ -190,15 +210,19 @@ describe('TaskStore', () => { definitions: taskDefinitions, savedObjectsRepository: savedObjectsClient, }); + }); + + async function testFetch(opts?: SearchOpts, hits: unknown[] = []) { + callCluster.mockResolvedValue({ hits: { hits } }); const result = await store.fetch(opts); - sinon.assert.calledOnce(callCluster); - sinon.assert.calledWith(callCluster, 'search'); + expect(callCluster).toHaveBeenCalledTimes(1); + expect(callCluster).toHaveBeenCalledWith('search', expect.anything()); return { result, - args: callCluster.args[0][1], + args: callCluster.mock.calls[0][1], }; } @@ -230,6 +254,13 @@ describe('TaskStore', () => { }, }); }); + + test('pushes error from call cluster to errors$', async () => { + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + callCluster.mockRejectedValue(new Error('Failure')); + await expect(store.fetch()).rejects.toThrowErrorMatchingInlineSnapshot(`"Failure"`); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); }); describe('claimAvailableTasks', () => { @@ -928,9 +959,46 @@ if (doc['task.runAt'].size()!=0) { }, ]); }); + + test('pushes error from saved objects client to errors$', async () => { + const callCluster = jest.fn(); + const store = new TaskStore({ + index: 'tasky', + taskManagerId: '', + serializer, + callCluster, + definitions: taskDefinitions, + maxAttempts: 2, + savedObjectsRepository: savedObjectsClient, + }); + + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + callCluster.mockRejectedValue(new Error('Failure')); + await expect( + store.claimAvailableTasks({ + claimOwnershipUntil: new Date(), + size: 10, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Failure"`); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); }); describe('update', () => { + let store: TaskStore; + + beforeAll(() => { + store = new TaskStore({ + index: 'tasky', + taskManagerId: '', + serializer, + callCluster: jest.fn(), + maxAttempts: 2, + definitions: taskDefinitions, + savedObjectsRepository: savedObjectsClient, + }); + }); + test('refreshes the index, handles versioning', async () => { const task = { runAt: mockedDate, @@ -959,16 +1027,6 @@ if (doc['task.runAt'].size()!=0) { } ); - const store = new TaskStore({ - index: 'tasky', - taskManagerId: '', - serializer, - callCluster: jest.fn(), - maxAttempts: 2, - definitions: taskDefinitions, - savedObjectsRepository: savedObjectsClient, - }); - const result = await store.update(task); expect(savedObjectsClient.update).toHaveBeenCalledWith( @@ -1002,28 +1060,116 @@ if (doc['task.runAt'].size()!=0) { version: '123', }); }); + + test('pushes error from saved objects client to errors$', async () => { + const task = { + runAt: mockedDate, + scheduledAt: mockedDate, + startedAt: null, + retryAt: null, + id: 'task:324242', + params: { hello: 'world' }, + state: { foo: 'bar' }, + taskType: 'report', + attempts: 3, + status: 'idle' as TaskStatus, + version: '123', + ownerId: null, + }; + + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + savedObjectsClient.update.mockRejectedValue(new Error('Failure')); + await expect(store.update(task)).rejects.toThrowErrorMatchingInlineSnapshot(`"Failure"`); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); + }); + + describe('bulkUpdate', () => { + let store: TaskStore; + + beforeAll(() => { + store = new TaskStore({ + index: 'tasky', + taskManagerId: '', + serializer, + callCluster: jest.fn(), + maxAttempts: 2, + definitions: taskDefinitions, + savedObjectsRepository: savedObjectsClient, + }); + }); + + test('pushes error from saved objects client to errors$', async () => { + const task = { + runAt: mockedDate, + scheduledAt: mockedDate, + startedAt: null, + retryAt: null, + id: 'task:324242', + params: { hello: 'world' }, + state: { foo: 'bar' }, + taskType: 'report', + attempts: 3, + status: 'idle' as TaskStatus, + version: '123', + ownerId: null, + }; + + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + savedObjectsClient.bulkUpdate.mockRejectedValue(new Error('Failure')); + await expect(store.bulkUpdate([task])).rejects.toThrowErrorMatchingInlineSnapshot( + `"Failure"` + ); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); }); describe('remove', () => { - test('removes the task with the specified id', async () => { - const id = `id-${_.random(1, 20)}`; - const callCluster = jest.fn(); - const store = new TaskStore({ + let store: TaskStore; + + beforeAll(() => { + store = new TaskStore({ index: 'tasky', taskManagerId: '', serializer, - callCluster, + callCluster: jest.fn(), maxAttempts: 2, definitions: taskDefinitions, savedObjectsRepository: savedObjectsClient, }); + }); + + test('removes the task with the specified id', async () => { + const id = `id-${_.random(1, 20)}`; const result = await store.remove(id); expect(result).toBeUndefined(); expect(savedObjectsClient.delete).toHaveBeenCalledWith('task', id); }); + + test('pushes error from saved objects client to errors$', async () => { + const id = `id-${_.random(1, 20)}`; + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + savedObjectsClient.delete.mockRejectedValue(new Error('Failure')); + await expect(store.remove(id)).rejects.toThrowErrorMatchingInlineSnapshot(`"Failure"`); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); }); describe('get', () => { + let store: TaskStore; + + beforeAll(() => { + store = new TaskStore({ + index: 'tasky', + taskManagerId: '', + serializer, + callCluster: jest.fn(), + maxAttempts: 2, + definitions: taskDefinitions, + savedObjectsRepository: savedObjectsClient, + }); + }); + test('gets the task with the specified id', async () => { const id = `id-${_.random(1, 20)}`; const task = { @@ -1041,7 +1187,6 @@ if (doc['task.runAt'].size()!=0) { ownerId: null, }; - const callCluster = jest.fn(); savedObjectsClient.get.mockImplementation(async (type: string, objectId: string) => ({ id: objectId, type, @@ -1053,22 +1198,20 @@ if (doc['task.runAt'].size()!=0) { version: '123', })); - const store = new TaskStore({ - index: 'tasky', - taskManagerId: '', - serializer, - callCluster, - maxAttempts: 2, - definitions: taskDefinitions, - savedObjectsRepository: savedObjectsClient, - }); - const result = await store.get(id); expect(result).toEqual(task); expect(savedObjectsClient.get).toHaveBeenCalledWith('task', id); }); + + test('pushes error from saved objects client to errors$', async () => { + const id = `id-${_.random(1, 20)}`; + const firstErrorPromise = store.errors$.pipe(first()).toPromise(); + savedObjectsClient.get.mockRejectedValue(new Error('Failure')); + await expect(store.get(id)).rejects.toThrowErrorMatchingInlineSnapshot(`"Failure"`); + expect(await firstErrorPromise).toMatchInlineSnapshot(`[Error: Failure]`); + }); }); describe('getLifecycle', () => { diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts index acd19bd75f7a3..15261be3d89ae 100644 --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -121,6 +121,7 @@ export class TaskStore { public readonly maxAttempts: number; public readonly index: string; public readonly taskManagerId: string; + public readonly errors$ = new Subject(); private callCluster: ElasticJs; private definitions: TaskDictionary; @@ -171,11 +172,17 @@ export class TaskStore { ); } - const savedObject = await this.savedObjectsRepository.create( - 'task', - taskInstanceToAttributes(taskInstance), - { id: taskInstance.id, refresh: false } - ); + let savedObject; + try { + savedObject = await this.savedObjectsRepository.create( + 'task', + taskInstanceToAttributes(taskInstance), + { id: taskInstance.id, refresh: false } + ); + } catch (e) { + this.errors$.next(e); + throw e; + } return savedObjectToConcreteTaskInstance(savedObject); } @@ -333,12 +340,22 @@ export class TaskStore { */ public async update(doc: ConcreteTaskInstance): Promise { const attributes = taskInstanceToAttributes(doc); - const updatedSavedObject = await this.savedObjectsRepository.update< - SerializedConcreteTaskInstance - >('task', doc.id, attributes, { - refresh: false, - version: doc.version, - }); + + let updatedSavedObject; + try { + updatedSavedObject = await this.savedObjectsRepository.update( + 'task', + doc.id, + attributes, + { + refresh: false, + version: doc.version, + } + ); + } catch (e) { + this.errors$.next(e); + throw e; + } return savedObjectToConcreteTaskInstance( // The SavedObjects update api forces a Partial on the `attributes` on the response, @@ -362,8 +379,11 @@ export class TaskStore { return attrsById; }, new Map()); - const updatedSavedObjects: Array = ( - await this.savedObjectsRepository.bulkUpdate( + let updatedSavedObjects: Array; + try { + ({ saved_objects: updatedSavedObjects } = await this.savedObjectsRepository.bulkUpdate< + SerializedConcreteTaskInstance + >( docs.map((doc) => ({ type: 'task', id: doc.id, @@ -373,8 +393,11 @@ export class TaskStore { { refresh: false, } - ) - ).saved_objects; + )); + } catch (e) { + this.errors$.next(e); + throw e; + } return updatedSavedObjects.map((updatedSavedObject, index) => isSavedObjectsUpdateResponse(updatedSavedObject) @@ -404,7 +427,12 @@ export class TaskStore { * @returns {Promise} */ public async remove(id: string): Promise { - await this.savedObjectsRepository.delete('task', id); + try { + await this.savedObjectsRepository.delete('task', id); + } catch (e) { + this.errors$.next(e); + throw e; + } } /** @@ -414,7 +442,14 @@ export class TaskStore { * @returns {Promise} */ public async get(id: string): Promise { - return savedObjectToConcreteTaskInstance(await this.savedObjectsRepository.get('task', id)); + let result; + try { + result = await this.savedObjectsRepository.get('task', id); + } catch (e) { + this.errors$.next(e); + throw e; + } + return savedObjectToConcreteTaskInstance(result); } /** @@ -438,14 +473,20 @@ export class TaskStore { private async search(opts: SearchOpts = {}): Promise { const { query } = ensureQueryOnlyReturnsTaskObjects(opts); - const result = await this.callCluster('search', { - index: this.index, - ignoreUnavailable: true, - body: { - ...opts, - query, - }, - }); + let result; + try { + result = await this.callCluster('search', { + index: this.index, + ignoreUnavailable: true, + body: { + ...opts, + query, + }, + }); + } catch (e) { + this.errors$.next(e); + throw e; + } const rawDocs = (result as SearchResponse).hits.hits; @@ -464,17 +505,23 @@ export class TaskStore { { max_docs }: UpdateByQueryOpts = {} ): Promise { const { query } = ensureQueryOnlyReturnsTaskObjects(opts); - const result = await this.callCluster('updateByQuery', { - index: this.index, - ignoreUnavailable: true, - refresh: true, - max_docs, - conflicts: 'proceed', - body: { - ...opts, - query, - }, - }); + let result; + try { + result = await this.callCluster('updateByQuery', { + index: this.index, + ignoreUnavailable: true, + refresh: true, + max_docs, + conflicts: 'proceed', + body: { + ...opts, + query, + }, + }); + } catch (e) { + this.errors$.next(e); + throw e; + } // eslint-disable-next-line @typescript-eslint/naming-convention const { total, updated, version_conflicts } = result as UpdateDocumentByQueryResponse; From 1d1c3c7ef305cb4a8ca8eea8634b92ec8fde5fd7 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 13 Oct 2020 16:47:23 +0300 Subject: [PATCH 38/85] [Step 1] use Observables on server search API (#79874) * use Observables on server search API * fix PR comments Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- ...plugin-plugins-data-server.isearchstart.md | 2 +- ...plugins-data-server.isearchstart.search.md | 2 +- ...gin-plugins-data-server.isearchstrategy.md | 2 +- ...gins-data-server.isearchstrategy.search.md | 2 +- .../search_examples/server/my_strategy.ts | 15 +-- .../server/routes/server_search_route.ts | 34 +++--- .../data/public/search/search_service.ts | 2 +- .../es_search/es_search_strategy.test.ts | 77 +++++++------ .../search/es_search/es_search_strategy.ts | 80 +++++++------- .../data/server/search/routes/search.test.ts | 25 +++-- .../data/server/search/routes/search.ts | 18 +-- .../data/server/search/search_service.ts | 37 ++++--- src/plugins/data/server/search/types.ts | 39 +++---- src/plugins/data/server/server.api.md | 6 +- .../server/routes/validate_es.ts | 15 ++- .../server/series_functions/es/es.test.js | 7 +- .../server/series_functions/es/index.js | 12 +- .../abstract_search_strategy.test.js | 7 +- .../strategies/abstract_search_strategy.ts | 28 ++--- .../server/search/eql_search_strategy.test.ts | 48 +++++--- .../server/search/eql_search_strategy.ts | 82 +++++++------- .../server/search/es_search_strategy.test.ts | 26 +++-- .../server/search/es_search_strategy.ts | 68 ++++++------ .../search_strategy/index_fields/index.ts | 104 +++++++++--------- .../security_solution/index.ts | 8 +- .../server/search_strategy/timeline/index.ts | 9 +- 26 files changed, 423 insertions(+), 332 deletions(-) diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md index 9c47ea1a166d5..b99c5f0f10a9e 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.md @@ -16,6 +16,6 @@ export interface ISearchStartAggsStart | | | [getSearchStrategy](./kibana-plugin-plugins-data-server.isearchstart.getsearchstrategy.md) | (name: string) => ISearchStrategy<SearchStrategyRequest, SearchStrategyResponse> | Get other registered search strategies. For example, if a new strategy needs to use the already-registered ES search strategy, it can use this function to accomplish that. | -| [search](./kibana-plugin-plugins-data-server.isearchstart.search.md) | (context: RequestHandlerContext, request: SearchStrategyRequest, options: ISearchOptions) => Promise<SearchStrategyResponse> | | +| [search](./kibana-plugin-plugins-data-server.isearchstart.search.md) | ISearchStrategy['search'] | | | [searchSource](./kibana-plugin-plugins-data-server.isearchstart.searchsource.md) | {
asScoped: (request: KibanaRequest) => Promise<ISearchStartSearchSource>;
} | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md index fdcd4d6768db5..98ea175aaaea7 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstart.search.md @@ -7,5 +7,5 @@ Signature: ```typescript -search: (context: RequestHandlerContext, request: SearchStrategyRequest, options: ISearchOptions) => Promise; +search: ISearchStrategy['search']; ``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.md index 3d2caf417f3cb..6dd95da2be3c1 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.md @@ -17,5 +17,5 @@ export interface ISearchStrategy(context: RequestHandlerContext, id: string) => Promise<void> | | -| [search](./kibana-plugin-plugins-data-server.isearchstrategy.search.md) | (context: RequestHandlerContext, request: SearchStrategyRequest, options?: ISearchOptions) => Promise<SearchStrategyResponse> | | +| [search](./kibana-plugin-plugins-data-server.isearchstrategy.search.md) | (request: SearchStrategyRequest, options: ISearchOptions, context: RequestHandlerContext) => Observable<SearchStrategyResponse> | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.search.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.search.md index 45f43648ab603..84b90ae23f916 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.search.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.isearchstrategy.search.md @@ -7,5 +7,5 @@ Signature: ```typescript -search: (context: RequestHandlerContext, request: SearchStrategyRequest, options?: ISearchOptions) => Promise; +search: (request: SearchStrategyRequest, options: ISearchOptions, context: RequestHandlerContext) => Observable; ``` diff --git a/examples/search_examples/server/my_strategy.ts b/examples/search_examples/server/my_strategy.ts index 169982544e6e8..26e7056cdd787 100644 --- a/examples/search_examples/server/my_strategy.ts +++ b/examples/search_examples/server/my_strategy.ts @@ -17,6 +17,7 @@ * under the License. */ +import { map } from 'rxjs/operators'; import { ISearchStrategy, PluginStart } from '../../../src/plugins/data/server'; import { IMyStrategyResponse, IMyStrategyRequest } from '../common'; @@ -25,13 +26,13 @@ export const mySearchStrategyProvider = ( ): ISearchStrategy => { const es = data.search.getSearchStrategy('es'); return { - search: async (context, request, options): Promise => { - const esSearchRes = await es.search(context, request, options); - return { - ...esSearchRes, - cool: request.get_cool ? 'YES' : 'NOPE', - }; - }, + search: (request, options, context) => + es.search(request, options, context).pipe( + map((esSearchRes) => ({ + ...esSearchRes, + cool: request.get_cool ? 'YES' : 'NOPE', + })) + ), cancel: async (context, id) => { if (es.cancel) { es.cancel(context, id); diff --git a/examples/search_examples/server/routes/server_search_route.ts b/examples/search_examples/server/routes/server_search_route.ts index 6eb21cf34b4a3..21ae38b99f3d2 100644 --- a/examples/search_examples/server/routes/server_search_route.ts +++ b/examples/search_examples/server/routes/server_search_route.ts @@ -39,26 +39,28 @@ export function registerServerSearchRoute(router: IRouter, data: DataPluginStart // Run a synchronous search server side, by enforcing a high keepalive and waiting for completion. // If you wish to run the search with polling (in basic+), you'd have to poll on the search API. // Please reach out to the @app-arch-team if you need this to be implemented. - const res = await data.search.search( - context, - { - params: { - index, - body: { - aggs: { - '1': { - avg: { - field, + const res = await data.search + .search( + { + params: { + index, + body: { + aggs: { + '1': { + avg: { + field, + }, }, }, }, + waitForCompletionTimeout: '5m', + keepAlive: '5m', }, - waitForCompletionTimeout: '5m', - keepAlive: '5m', - }, - } as IEsSearchRequest, - {} - ); + } as IEsSearchRequest, + {}, + context + ) + .toPromise(); return response.ok({ body: { diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 2d582b30bcd14..734e88e085661 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -127,7 +127,7 @@ export class SearchService implements Plugin { request: SearchStrategyRequest, options: ISearchOptions ) => { - return search(request, options).toPromise() as Promise; + return search(request, options).toPromise(); }, onResponse: handleResponse, legacy: { diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts index 504ce728481f0..2dbcc3196aa75 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.test.ts @@ -35,7 +35,8 @@ describe('ES search strategy', () => { }, }, }); - const mockContext = { + + const mockContext = ({ core: { uiSettings: { client: { @@ -44,7 +45,8 @@ describe('ES search strategy', () => { }, elasticsearch: { client: { asCurrentUser: { search: mockApiCaller } } }, }, - }; + } as unknown) as RequestHandlerContext; + const mockConfig$ = pluginInitializerContextConfigMock({}).legacy.globalConfig$; beforeEach(() => { @@ -57,44 +59,51 @@ describe('ES search strategy', () => { expect(typeof esSearch.search).toBe('function'); }); - it('calls the API caller with the params with defaults', async () => { + it('calls the API caller with the params with defaults', async (done) => { const params = { index: 'logstash-*' }; - const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); - await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); - - expect(mockApiCaller).toBeCalled(); - expect(mockApiCaller.mock.calls[0][0]).toEqual({ - ...params, - ignore_unavailable: true, - track_total_hits: true, - }); + await esSearchStrategyProvider(mockConfig$, mockLogger) + .search({ params }, {}, mockContext) + .subscribe(() => { + expect(mockApiCaller).toBeCalled(); + expect(mockApiCaller.mock.calls[0][0]).toEqual({ + ...params, + ignore_unavailable: true, + track_total_hits: true, + }); + done(); + }); }); - it('calls the API caller with overridden defaults', async () => { + it('calls the API caller with overridden defaults', async (done) => { const params = { index: 'logstash-*', ignore_unavailable: false, timeout: '1000ms' }; - const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); - - await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); - expect(mockApiCaller).toBeCalled(); - expect(mockApiCaller.mock.calls[0][0]).toEqual({ - ...params, - track_total_hits: true, - }); + await esSearchStrategyProvider(mockConfig$, mockLogger) + .search({ params }, {}, mockContext) + .subscribe(() => { + expect(mockApiCaller).toBeCalled(); + expect(mockApiCaller.mock.calls[0][0]).toEqual({ + ...params, + track_total_hits: true, + }); + done(); + }); }); - it('has all response parameters', async () => { - const params = { index: 'logstash-*' }; - const esSearch = await esSearchStrategyProvider(mockConfig$, mockLogger); - - const response = await esSearch.search((mockContext as unknown) as RequestHandlerContext, { - params, - }); - - expect(response.isRunning).toBe(false); - expect(response.isPartial).toBe(false); - expect(response).toHaveProperty('loaded'); - expect(response).toHaveProperty('rawResponse'); - }); + it('has all response parameters', async (done) => + await esSearchStrategyProvider(mockConfig$, mockLogger) + .search( + { + params: { index: 'logstash-*' }, + }, + {}, + mockContext + ) + .subscribe((data) => { + expect(data.isRunning).toBe(false); + expect(data.isPartial).toBe(false); + expect(data).toHaveProperty('loaded'); + expect(data).toHaveProperty('rawResponse'); + done(); + })); }); diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index 6e185d30ad56a..92cc941e14853 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ +import { Observable, from } from 'rxjs'; import { first } from 'rxjs/operators'; import { SharedGlobalConfig, Logger } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; -import { Observable } from 'rxjs'; import { ApiResponse } from '@elastic/elasticsearch'; import { SearchUsage } from '../collectors/usage'; import { toSnakeCase } from './to_snake_case'; @@ -29,6 +29,7 @@ import { getTotalLoaded, getShardTimeout, shimAbortSignal, + IEsSearchResponse, } from '..'; export const esSearchStrategyProvider = ( @@ -37,47 +38,52 @@ export const esSearchStrategyProvider = ( usage?: SearchUsage ): ISearchStrategy => { return { - search: async (context, request, options) => { - logger.debug(`search ${request.params?.index}`); - const config = await config$.pipe(first()).toPromise(); - const uiSettingsClient = await context.core.uiSettings.client; + search: (request, options, context) => + from( + new Promise(async (resolve, reject) => { + logger.debug(`search ${request.params?.index}`); + const config = await config$.pipe(first()).toPromise(); + const uiSettingsClient = await context.core.uiSettings.client; - // Only default index pattern type is supported here. - // See data_enhanced for other type support. - if (!!request.indexType) { - throw new Error(`Unsupported index pattern type ${request.indexType}`); - } + // Only default index pattern type is supported here. + // See data_enhanced for other type support. + if (!!request.indexType) { + throw new Error(`Unsupported index pattern type ${request.indexType}`); + } - // ignoreThrottled is not supported in OSS - const { ignoreThrottled, ...defaultParams } = await getDefaultSearchParams(uiSettingsClient); + // ignoreThrottled is not supported in OSS + const { ignoreThrottled, ...defaultParams } = await getDefaultSearchParams( + uiSettingsClient + ); - const params = toSnakeCase({ - ...defaultParams, - ...getShardTimeout(config), - ...request.params, - }); + const params = toSnakeCase({ + ...defaultParams, + ...getShardTimeout(config), + ...request.params, + }); - try { - const promise = shimAbortSignal( - context.core.elasticsearch.client.asCurrentUser.search(params), - options?.abortSignal - ); - const { body: rawResponse } = (await promise) as ApiResponse>; + try { + const promise = shimAbortSignal( + context.core.elasticsearch.client.asCurrentUser.search(params), + options?.abortSignal + ); + const { body: rawResponse } = (await promise) as ApiResponse>; - if (usage) usage.trackSuccess(rawResponse.took); + if (usage) usage.trackSuccess(rawResponse.took); - // The above query will either complete or timeout and throw an error. - // There is no progress indication on this api. - return { - isPartial: false, - isRunning: false, - rawResponse, - ...getTotalLoaded(rawResponse._shards), - }; - } catch (e) { - if (usage) usage.trackError(); - throw e; - } - }, + // The above query will either complete or timeout and throw an error. + // There is no progress indication on this api. + resolve({ + isPartial: false, + isRunning: false, + rawResponse, + ...getTotalLoaded(rawResponse._shards), + }); + } catch (e) { + if (usage) usage.trackError(); + reject(e); + } + }) + ), }; }; diff --git a/src/plugins/data/server/search/routes/search.test.ts b/src/plugins/data/server/search/routes/search.test.ts index d4404c318ab47..834e5de5c3121 100644 --- a/src/plugins/data/server/search/routes/search.test.ts +++ b/src/plugins/data/server/search/routes/search.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Observable } from 'rxjs'; +import { Observable, from } from 'rxjs'; import { CoreSetup, @@ -66,7 +66,8 @@ describe('Search service', () => { }, }, }; - mockDataStart.search.search.mockResolvedValue(response); + + mockDataStart.search.search.mockReturnValue(from(Promise.resolve(response))); const mockContext = {}; const mockBody = { id: undefined, params: {} }; const mockParams = { strategy: 'foo' }; @@ -83,7 +84,7 @@ describe('Search service', () => { await handler((mockContext as unknown) as RequestHandlerContext, mockRequest, mockResponse); expect(mockDataStart.search.search).toBeCalled(); - expect(mockDataStart.search.search.mock.calls[0][1]).toStrictEqual(mockBody); + expect(mockDataStart.search.search.mock.calls[0][0]).toStrictEqual(mockBody); expect(mockResponse.ok).toBeCalled(); expect(mockResponse.ok.mock.calls[0][0]).toEqual({ body: response, @@ -91,12 +92,16 @@ describe('Search service', () => { }); it('handler throws an error if the search throws an error', async () => { - mockDataStart.search.search.mockRejectedValue({ - message: 'oh no', - body: { - error: 'oops', - }, - }); + const rejectedValue = from( + Promise.reject({ + message: 'oh no', + body: { + error: 'oops', + }, + }) + ); + + mockDataStart.search.search.mockReturnValue(rejectedValue); const mockContext = {}; const mockBody = { id: undefined, params: {} }; @@ -114,7 +119,7 @@ describe('Search service', () => { await handler((mockContext as unknown) as RequestHandlerContext, mockRequest, mockResponse); expect(mockDataStart.search.search).toBeCalled(); - expect(mockDataStart.search.search.mock.calls[0][1]).toStrictEqual(mockBody); + expect(mockDataStart.search.search.mock.calls[0][0]).toStrictEqual(mockBody); expect(mockResponse.customError).toBeCalled(); const error: any = mockResponse.customError.mock.calls[0][0]; expect(error.body.message).toBe('oh no'); diff --git a/src/plugins/data/server/search/routes/search.ts b/src/plugins/data/server/search/routes/search.ts index 492ad4395b32a..1e8433d9685e3 100644 --- a/src/plugins/data/server/search/routes/search.ts +++ b/src/plugins/data/server/search/routes/search.ts @@ -49,14 +49,16 @@ export function registerSearchRoute( const [, , selfStart] = await getStartServices(); try { - const response = await selfStart.search.search( - context, - { ...searchRequest, id }, - { - abortSignal, - strategy, - } - ); + const response = await selfStart.search + .search( + { ...searchRequest, id }, + { + abortSignal, + strategy, + }, + context + ) + .toPromise(); return res.ok({ body: { diff --git a/src/plugins/data/server/search/search_service.ts b/src/plugins/data/server/search/search_service.ts index 6e66f8027207b..0130d3aacc91f 100644 --- a/src/plugins/data/server/search/search_service.ts +++ b/src/plugins/data/server/search/search_service.ts @@ -49,10 +49,10 @@ import { IKibanaSearchResponse, IEsSearchRequest, IEsSearchResponse, - ISearchOptions, SearchSourceDependencies, SearchSourceService, searchSourceRequiredUiSettings, + ISearchOptions, } from '../../common/search'; import { getShardDelayBucketAgg, @@ -151,13 +151,7 @@ export class SearchService implements Plugin { return { aggs: this.aggsService.start({ fieldFormats, uiSettings }), getSearchStrategy: this.getSearchStrategy, - search: ( - context: RequestHandlerContext, - searchRequest: IKibanaSearchRequest, - options: Record - ) => { - return this.search(context, searchRequest, options); - }, + search: this.search.bind(this), searchSource: { asScoped: async (request: KibanaRequest) => { const esClient = elasticsearch.client.asScoped(request); @@ -175,7 +169,13 @@ export class SearchService implements Plugin { const searchSourceDependencies: SearchSourceDependencies = { getConfig: (key: string): T => uiSettingsCache[key], - search: (searchRequest, options) => { + search: < + SearchStrategyRequest extends IKibanaSearchRequest = IEsSearchRequest, + SearchStrategyResponse extends IKibanaSearchResponse = IEsSearchResponse + >( + searchStrategyRequest: SearchStrategyRequest, + options: ISearchOptions + ) => { /** * Unless we want all SearchSource users to provide both a KibanaRequest * (needed for index patterns) AND the RequestHandlerContext (needed for @@ -195,7 +195,12 @@ export class SearchService implements Plugin { }, }, } as RequestHandlerContext; - return this.search(fakeRequestHandlerContext, searchRequest, options); + + return this.search( + searchStrategyRequest, + options, + fakeRequestHandlerContext + ).toPromise(); }, // onResponse isn't used on the server, so we just return the original value onResponse: (req, res) => res, @@ -234,13 +239,15 @@ export class SearchService implements Plugin { SearchStrategyRequest extends IKibanaSearchRequest = IEsSearchRequest, SearchStrategyResponse extends IKibanaSearchResponse = IEsSearchResponse >( - context: RequestHandlerContext, searchRequest: SearchStrategyRequest, - options: ISearchOptions - ): Promise => { - return this.getSearchStrategy( + options: ISearchOptions, + context: RequestHandlerContext + ) => { + const strategy = this.getSearchStrategy( options.strategy || this.defaultSearchStrategyName - ).search(context, searchRequest, options); + ); + + return strategy.search(searchRequest, options, context); }; private getSearchStrategy = < diff --git a/src/plugins/data/server/search/types.ts b/src/plugins/data/server/search/types.ts index 0de4ef529e896..9ba06d88dc4b3 100644 --- a/src/plugins/data/server/search/types.ts +++ b/src/plugins/data/server/search/types.ts @@ -17,6 +17,7 @@ * under the License. */ +import { Observable } from 'rxjs'; import { KibanaRequest, RequestHandlerContext } from 'src/core/server'; import { ISearchOptions, @@ -57,6 +58,22 @@ export interface ISearchSetup { __enhance: (enhancements: SearchEnhancements) => void; } +/** + * Search strategy interface contains a search method that takes in a request and returns a promise + * that resolves to a response. + */ +export interface ISearchStrategy< + SearchStrategyRequest extends IKibanaSearchRequest = IEsSearchRequest, + SearchStrategyResponse extends IKibanaSearchResponse = IEsSearchResponse +> { + search: ( + request: SearchStrategyRequest, + options: ISearchOptions, + context: RequestHandlerContext + ) => Observable; + cancel?: (context: RequestHandlerContext, id: string) => Promise; +} + export interface ISearchStart< SearchStrategyRequest extends IKibanaSearchRequest = IEsSearchRequest, SearchStrategyResponse extends IKibanaSearchResponse = IEsSearchResponse @@ -69,28 +86,8 @@ export interface ISearchStart< getSearchStrategy: ( name: string ) => ISearchStrategy; - search: ( - context: RequestHandlerContext, - request: SearchStrategyRequest, - options: ISearchOptions - ) => Promise; + search: ISearchStrategy['search']; searchSource: { asScoped: (request: KibanaRequest) => Promise; }; } - -/** - * Search strategy interface contains a search method that takes in a request and returns a promise - * that resolves to a response. - */ -export interface ISearchStrategy< - SearchStrategyRequest extends IKibanaSearchRequest = IEsSearchRequest, - SearchStrategyResponse extends IKibanaSearchResponse = IEsSearchResponse -> { - search: ( - context: RequestHandlerContext, - request: SearchStrategyRequest, - options?: ISearchOptions - ) => Promise; - cancel?: (context: RequestHandlerContext, id: string) => Promise; -} diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 07afad1c96a06..f2c8ff5344b9a 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -713,7 +713,7 @@ export interface ISearchStart ISearchStrategy; // (undocumented) - search: (context: RequestHandlerContext, request: SearchStrategyRequest, options: ISearchOptions) => Promise; + search: ISearchStrategy['search']; // (undocumented) searchSource: { asScoped: (request: KibanaRequest) => Promise; @@ -727,7 +727,7 @@ export interface ISearchStrategy Promise; // (undocumented) - search: (context: RequestHandlerContext, request: SearchStrategyRequest, options?: ISearchOptions) => Promise; + search: (request: SearchStrategyRequest, options: ISearchOptions, context: RequestHandlerContext) => Observable; } // @public (undocumented) @@ -1140,7 +1140,7 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:254:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index_patterns/index_patterns_service.ts:50:14 - (ae-forgotten-export) The symbol "IndexPatternsService" needs to be exported by the entry point index.d.ts // src/plugins/data/server/plugin.ts:88:66 - (ae-forgotten-export) The symbol "DataEnhancements" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/search/types.ts:78:5 - (ae-forgotten-export) The symbol "ISearchStartSearchSource" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/search/types.ts:91:5 - (ae-forgotten-export) The symbol "ISearchStartSearchSource" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/src/plugins/vis_type_timelion/server/routes/validate_es.ts b/src/plugins/vis_type_timelion/server/routes/validate_es.ts index ea08310499a96..242be515e52bc 100644 --- a/src/plugins/vis_type_timelion/server/routes/validate_es.ts +++ b/src/plugins/vis_type_timelion/server/routes/validate_es.ts @@ -57,10 +57,17 @@ export function validateEsRoute(router: IRouter, core: CoreSetup) { let resp; try { - resp = await deps.data.search.search(context, body, { - strategy: ES_SEARCH_STRATEGY, - }); - resp = resp.rawResponse; + resp = ( + await deps.data.search + .search( + body, + { + strategy: ES_SEARCH_STRATEGY, + }, + context + ) + .toPromise() + ).rawResponse; } catch (errResp) { resp = errResp; } diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js index c5fc4b7b93269..8be3cf5171c65 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/es.test.js @@ -16,9 +16,9 @@ * specific language governing permissions and limitations * under the License. */ +import { from } from 'rxjs'; import es from './index'; - import tlConfigFn from '../fixtures/tl_config'; import * as aggResponse from './lib/agg_response_to_series_list'; import buildRequest from './lib/build_request'; @@ -36,7 +36,10 @@ function stubRequestAndServer(response, indexPatternSavedObjects = []) { getStartServices: sinon .stub() .returns( - Promise.resolve([{}, { data: { search: { search: () => Promise.resolve(response) } } }]) + Promise.resolve([ + {}, + { data: { search: { search: () => from(Promise.resolve(response)) } } }, + ]) ), savedObjectsClient: { find: function () { diff --git a/src/plugins/vis_type_timelion/server/series_functions/es/index.js b/src/plugins/vis_type_timelion/server/series_functions/es/index.js index bfa8d75900d11..fc3250f0d4726 100644 --- a/src/plugins/vis_type_timelion/server/series_functions/es/index.js +++ b/src/plugins/vis_type_timelion/server/series_functions/es/index.js @@ -132,9 +132,15 @@ export default new Datasource('es', { const deps = (await tlConfig.getStartServices())[1]; - const resp = await deps.data.search.search(tlConfig.context, body, { - strategy: ES_SEARCH_STRATEGY, - }); + const resp = await deps.data.search + .search( + body, + { + strategy: ES_SEARCH_STRATEGY, + }, + tlConfig.context + ) + .toPromise(); if (!resp.rawResponse._shards.total) { throw new Error( diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.js b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.js index 4dcc67dc46976..ceae784cf74a6 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.js +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.js @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import { from } from 'rxjs'; import { AbstractSearchStrategy } from './abstract_search_strategy'; describe('AbstractSearchStrategy', () => { @@ -55,7 +56,7 @@ describe('AbstractSearchStrategy', () => { test('should return response', async () => { const searches = [{ body: 'body', index: 'index' }]; - const searchFn = jest.fn().mockReturnValue(Promise.resolve({})); + const searchFn = jest.fn().mockReturnValue(from(Promise.resolve({}))); const responses = await abstractSearchStrategy.search( { @@ -82,7 +83,6 @@ describe('AbstractSearchStrategy', () => { expect(responses).toEqual([{}]); expect(searchFn).toHaveBeenCalledWith( - {}, { params: { body: 'body', @@ -92,7 +92,8 @@ describe('AbstractSearchStrategy', () => { }, { strategy: 'es', - } + }, + {} ); }); }); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts index 2eb92b2b777e8..7b62ad310a354 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.ts @@ -60,20 +60,22 @@ export class AbstractSearchStrategy { const requests: any[] = []; bodies.forEach((body) => { requests.push( - deps.data.search.search( - req.requestContext, - { - params: { - ...body, - ...this.additionalParams, + deps.data.search + .search( + { + params: { + ...body, + ...this.additionalParams, + }, + indexType: this.indexType, }, - indexType: this.indexType, - }, - { - ...options, - strategy: this.searchStrategyName, - } - ) + { + ...options, + strategy: this.searchStrategyName, + }, + req.requestContext + ) + .toPromise() ); }); return Promise.all(requests); diff --git a/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.test.ts b/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.test.ts index 7f6663a39eeb3..5b634fe4cf26c 100644 --- a/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.test.ts +++ b/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.test.ts @@ -82,7 +82,7 @@ describe('EQL search strategy', () => { describe('async functionality', () => { it('performs an eql client search with params when no ID is provided', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { options, params }); + await eqlSearch.search({ options, params }, {}, mockContext).toPromise(); const [[request, requestOptions]] = mockEqlSearch.mock.calls; expect(request.index).toEqual('logstash-*'); @@ -92,7 +92,7 @@ describe('EQL search strategy', () => { it('retrieves the current request if an id is provided', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { id: 'my-search-id' }); + await eqlSearch.search({ id: 'my-search-id' }, {}, mockContext).toPromise(); const [[requestParams]] = mockEqlGet.mock.calls; expect(mockEqlSearch).not.toHaveBeenCalled(); @@ -103,7 +103,7 @@ describe('EQL search strategy', () => { describe('arguments', () => { it('sends along async search options', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { options, params }); + await eqlSearch.search({ options, params }, {}, mockContext).toPromise(); const [[request]] = mockEqlSearch.mock.calls; expect(request).toEqual( @@ -116,7 +116,7 @@ describe('EQL search strategy', () => { it('sends along default search parameters', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { options, params }); + await eqlSearch.search({ options, params }, {}, mockContext).toPromise(); const [[request]] = mockEqlSearch.mock.calls; expect(request).toEqual( @@ -129,14 +129,20 @@ describe('EQL search strategy', () => { it('allows search parameters to be overridden', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { - options, - params: { - ...params, - wait_for_completion_timeout: '5ms', - keep_on_completion: false, - }, - }); + await eqlSearch + .search( + { + options, + params: { + ...params, + wait_for_completion_timeout: '5ms', + keep_on_completion: false, + }, + }, + {}, + mockContext + ) + .toPromise(); const [[request]] = mockEqlSearch.mock.calls; expect(request).toEqual( @@ -150,10 +156,16 @@ describe('EQL search strategy', () => { it('allows search options to be overridden', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { - options: { ...options, maxRetries: 2, ignore: [300] }, - params, - }); + await eqlSearch + .search( + { + options: { ...options, maxRetries: 2, ignore: [300] }, + params, + }, + {}, + mockContext + ) + .toPromise(); const [[, requestOptions]] = mockEqlSearch.mock.calls; expect(requestOptions).toEqual( @@ -166,7 +178,9 @@ describe('EQL search strategy', () => { it('passes transport options for an existing request', async () => { const eqlSearch = await eqlSearchStrategyProvider(mockLogger); - await eqlSearch.search(mockContext, { id: 'my-search-id', options: { ignore: [400] } }); + await eqlSearch + .search({ id: 'my-search-id', options: { ignore: [400] } }, {}, mockContext) + .toPromise(); const [[, requestOptions]] = mockEqlGet.mock.calls; expect(mockEqlSearch).not.toHaveBeenCalled(); diff --git a/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts index 2516693a7f29b..a7ca999699e23 100644 --- a/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { from } from 'rxjs'; import { Logger } from 'kibana/server'; import { ApiResponse, TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; @@ -26,48 +27,51 @@ export const eqlSearchStrategyProvider = ( id, }); }, - search: async (context, request, options) => { - logger.debug(`_eql/search ${JSON.stringify(request.params) || request.id}`); - let promise: TransportRequestPromise; - const eqlClient = context.core.elasticsearch.client.asCurrentUser.eql; - const uiSettingsClient = await context.core.uiSettings.client; - const asyncOptions = getAsyncOptions(); - const searchOptions = toSnakeCase({ ...request.options }); + search: (request, options, context) => + from( + new Promise(async (resolve) => { + logger.debug(`_eql/search ${JSON.stringify(request.params) || request.id}`); + let promise: TransportRequestPromise; + const eqlClient = context.core.elasticsearch.client.asCurrentUser.eql; + const uiSettingsClient = await context.core.uiSettings.client; + const asyncOptions = getAsyncOptions(); + const searchOptions = toSnakeCase({ ...request.options }); - if (request.id) { - promise = eqlClient.get( - { - id: request.id, - ...toSnakeCase(asyncOptions), - }, - searchOptions - ); - } else { - const { ignoreThrottled, ignoreUnavailable } = await getDefaultSearchParams( - uiSettingsClient - ); - const searchParams = toSnakeCase({ - ignoreThrottled, - ignoreUnavailable, - ...asyncOptions, - ...request.params, - }); + if (request.id) { + promise = eqlClient.get( + { + id: request.id, + ...toSnakeCase(asyncOptions), + }, + searchOptions + ); + } else { + const { ignoreThrottled, ignoreUnavailable } = await getDefaultSearchParams( + uiSettingsClient + ); + const searchParams = toSnakeCase({ + ignoreThrottled, + ignoreUnavailable, + ...asyncOptions, + ...request.params, + }); - promise = eqlClient.search( - searchParams as EqlSearchStrategyRequest['params'], - searchOptions - ); - } + promise = eqlClient.search( + searchParams as EqlSearchStrategyRequest['params'], + searchOptions + ); + } - const rawResponse = await shimAbortSignal(promise, options?.abortSignal); - const { id, is_partial: isPartial, is_running: isRunning } = rawResponse.body; + const rawResponse = await shimAbortSignal(promise, options?.abortSignal); + const { id, is_partial: isPartial, is_running: isRunning } = rawResponse.body; - return { - id, - isPartial, - isRunning, - rawResponse, - }; - }, + resolve({ + id, + isPartial, + isRunning, + rawResponse, + }); + }) + ), }; }; diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts index f4f3d894a4576..bab304b6afc9f 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.test.ts @@ -86,7 +86,9 @@ describe('ES search strategy', () => { const params = { index: 'logstash-*', body: { query: {} } }; const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); - await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); + await esSearch + .search({ params }, {}, (mockContext as unknown) as RequestHandlerContext) + .toPromise(); expect(mockSubmitCaller).toBeCalled(); const request = mockSubmitCaller.mock.calls[0][0]; @@ -100,7 +102,9 @@ describe('ES search strategy', () => { const params = { index: 'logstash-*', body: { query: {} } }; const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); - await esSearch.search((mockContext as unknown) as RequestHandlerContext, { id: 'foo', params }); + await esSearch + .search({ id: 'foo', params }, {}, (mockContext as unknown) as RequestHandlerContext) + .toPromise(); expect(mockGetCaller).toBeCalled(); const request = mockGetCaller.mock.calls[0][0]; @@ -115,10 +119,16 @@ describe('ES search strategy', () => { const params = { index: 'foo-程', body: {} }; const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); - await esSearch.search((mockContext as unknown) as RequestHandlerContext, { - indexType: 'rollup', - params, - }); + await esSearch + .search( + { + indexType: 'rollup', + params, + }, + {}, + (mockContext as unknown) as RequestHandlerContext + ) + .toPromise(); expect(mockApiCaller).toBeCalled(); const { method, path } = mockApiCaller.mock.calls[0][0]; @@ -132,7 +142,9 @@ describe('ES search strategy', () => { const params = { index: 'foo-*', body: {} }; const esSearch = await enhancedEsSearchStrategyProvider(mockConfig$, mockLogger); - await esSearch.search((mockContext as unknown) as RequestHandlerContext, { params }); + await esSearch + .search({ params }, {}, (mockContext as unknown) as RequestHandlerContext) + .toPromise(); expect(mockSubmitCaller).toBeCalled(); const request = mockSubmitCaller.mock.calls[0][0]; diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index 7475228724388..9b89fb9fab3cb 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { from } from 'rxjs'; import { first } from 'rxjs/operators'; import { SearchResponse } from 'elasticsearch'; import { Observable } from 'rxjs'; @@ -36,35 +37,38 @@ export const enhancedEsSearchStrategyProvider = ( logger: Logger, usage?: SearchUsage ): ISearchStrategy => { - const search = async ( - context: RequestHandlerContext, + const search = ( request: IEnhancedEsSearchRequest, - options?: ISearchOptions - ) => { - logger.debug(`search ${JSON.stringify(request.params) || request.id}`); - - const isAsync = request.indexType !== 'rollup'; - - try { - const response = isAsync - ? await asyncSearch(context, request, options) - : await rollupSearch(context, request, options); - - if ( - usage && - isAsync && - isEnhancedEsSearchResponse(response) && - isCompleteResponse(response) - ) { - usage.trackSuccess(response.rawResponse.took); - } - - return response; - } catch (e) { - if (usage) usage.trackError(); - throw e; - } - }; + options: ISearchOptions, + context: RequestHandlerContext + ) => + from( + new Promise(async (resolve, reject) => { + logger.debug(`search ${JSON.stringify(request.params) || request.id}`); + + const isAsync = request.indexType !== 'rollup'; + + try { + const response = isAsync + ? await asyncSearch(request, options, context) + : await rollupSearch(request, options, context); + + if ( + usage && + isAsync && + isEnhancedEsSearchResponse(response) && + isCompleteResponse(response) + ) { + usage.trackSuccess(response.rawResponse.took); + } + + resolve(response); + } catch (e) { + if (usage) usage.trackError(); + reject(e); + } + }) + ); const cancel = async (context: RequestHandlerContext, id: string) => { logger.debug(`cancel ${id}`); @@ -74,9 +78,9 @@ export const enhancedEsSearchStrategyProvider = ( }; async function asyncSearch( - context: RequestHandlerContext, request: IEnhancedEsSearchRequest, - options?: ISearchOptions + options: ISearchOptions, + context: RequestHandlerContext ): Promise { let promise: TransportRequestPromise; const esClient = context.core.elasticsearch.client.asCurrentUser; @@ -112,9 +116,9 @@ export const enhancedEsSearchStrategyProvider = ( } const rollupSearch = async function ( - context: RequestHandlerContext, request: IEnhancedEsSearchRequest, - options?: ISearchOptions + options: ISearchOptions, + context: RequestHandlerContext ): Promise { const esClient = context.core.elasticsearch.client.asCurrentUser; const uiSettingsClient = await context.core.uiSettings.client; diff --git a/x-pack/plugins/security_solution/server/search_strategy/index_fields/index.ts b/x-pack/plugins/security_solution/server/search_strategy/index_fields/index.ts index da29cae0eebeb..bc461f3885a70 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/index_fields/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/index_fields/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { from } from 'rxjs'; import isEmpty from 'lodash/isEmpty'; import { IndexPatternsFetcher, ISearchStrategy } from '../../../../../../src/plugins/data/server'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths @@ -25,60 +26,63 @@ export const securitySolutionIndexFieldsProvider = (): ISearchStrategy< const beatFields: BeatFields = require('../../utils/beat_schema/fields').fieldsBeat; return { - search: async (context, request) => { - const { elasticsearch } = context.core; - const indexPatternsFetcher = new IndexPatternsFetcher( - elasticsearch.legacy.client.callAsCurrentUser - ); - const dedupeIndices = dedupeIndexName(request.indices); + search: (request, options, context) => + from( + new Promise(async (resolve) => { + const { elasticsearch } = context.core; + const indexPatternsFetcher = new IndexPatternsFetcher( + elasticsearch.legacy.client.callAsCurrentUser + ); + const dedupeIndices = dedupeIndexName(request.indices); - const responsesIndexFields = await Promise.all( - dedupeIndices - .map((index) => - indexPatternsFetcher.getFieldsForWildcard({ - pattern: index, - }) - ) - .map((p) => p.catch((e) => false)) - ); - let indexFields: IndexField[] = []; + const responsesIndexFields = await Promise.all( + dedupeIndices + .map((index) => + indexPatternsFetcher.getFieldsForWildcard({ + pattern: index, + }) + ) + .map((p) => p.catch((e) => false)) + ); + let indexFields: IndexField[] = []; - if (!request.onlyCheckIfIndicesExist) { - indexFields = await formatIndexFields( - beatFields, - responsesIndexFields.filter((rif) => rif !== false) as FieldDescriptor[][], - dedupeIndices - ); - } + if (!request.onlyCheckIfIndicesExist) { + indexFields = await formatIndexFields( + beatFields, + responsesIndexFields.filter((rif) => rif !== false) as FieldDescriptor[][], + dedupeIndices + ); + } - return Promise.resolve({ - indexFields, - indicesExist: dedupeIndices.filter((index, i) => responsesIndexFields[i] !== false), - rawResponse: { - timed_out: false, - took: -1, - _shards: { - total: -1, - successful: -1, - failed: -1, - skipped: -1, - }, - hits: { - total: -1, - max_score: -1, - hits: [ - { - _index: '', - _type: '', - _id: '', - _score: -1, - _source: null, + return resolve({ + indexFields, + indicesExist: dedupeIndices.filter((index, i) => responsesIndexFields[i] !== false), + rawResponse: { + timed_out: false, + took: -1, + _shards: { + total: -1, + successful: -1, + failed: -1, + skipped: -1, }, - ], - }, - }, - }); - }, + hits: { + total: -1, + max_score: -1, + hits: [ + { + _index: '', + _type: '', + _id: '', + _score: -1, + _source: null, + }, + ], + }, + }, + }); + }) + ), }; }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts index d94a32174cd7a..962865880df5f 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { mergeMap } from 'rxjs/operators'; import { ISearchStrategy, PluginStart } from '../../../../../../src/plugins/data/server'; import { FactoryQueryTypes, @@ -19,15 +20,16 @@ export const securitySolutionSearchStrategyProvider = { + search: (request, options, context) => { if (request.factoryQueryType == null) { throw new Error('factoryQueryType is required'); } const queryFactory: SecuritySolutionFactory = securitySolutionFactory[request.factoryQueryType]; const dsl = queryFactory.buildDsl(request); - const esSearchRes = await es.search(context, { ...request, params: dsl }, options); - return queryFactory.parse(request, esSearchRes); + return es + .search({ ...request, params: dsl }, options, context) + .pipe(mergeMap((esSearchRes) => queryFactory.parse(request, esSearchRes))); }, cancel: async (context, id) => { if (es.cancel) { diff --git a/x-pack/plugins/security_solution/server/search_strategy/timeline/index.ts b/x-pack/plugins/security_solution/server/search_strategy/timeline/index.ts index 6d8505211123b..165f0f586ebdb 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/timeline/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/timeline/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { mergeMap } from 'rxjs/operators'; import { ISearchStrategy, PluginStart } from '../../../../../../src/plugins/data/server'; import { TimelineFactoryQueryTypes, @@ -19,15 +20,17 @@ export const securitySolutionTimelineSearchStrategyProvider = { + search: (request, options, context) => { if (request.factoryQueryType == null) { throw new Error('factoryQueryType is required'); } const queryFactory: SecuritySolutionTimelineFactory = securitySolutionTimelineFactory[request.factoryQueryType]; const dsl = queryFactory.buildDsl(request); - const esSearchRes = await es.search(context, { ...request, params: dsl }, options); - return queryFactory.parse(request, esSearchRes); + + return es + .search({ ...request, params: dsl }, options, context) + .pipe(mergeMap((esSearchRes) => queryFactory.parse(request, esSearchRes))); }, cancel: async (context, id) => { if (es.cancel) { From acfee87210a1690744f8ceedfca1ca56c8f5ccd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Tue, 13 Oct 2020 15:11:55 +0100 Subject: [PATCH 39/85] [APM] React key warning when opening popover with external resources (#80328) --- .../public/components/app/ServiceMap/Popover/Info.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Info.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Info.tsx index 7771a232a5c9e..d0902c427aac8 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Info.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Info.tsx @@ -10,7 +10,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import cytoscape from 'cytoscape'; -import React from 'react'; +import React, { Fragment } from 'react'; import styled from 'styled-components'; import { SPAN_SUBTYPE, @@ -71,7 +71,7 @@ export function Info(data: InfoProps) { resource.label || resource['span.destination.service.resource']; const desc = `${resource['span.type']} (${resource['span.subtype']})`; return ( - <> + {desc} - + ); })} @@ -97,8 +97,8 @@ export function Info(data: InfoProps) { {listItems.map( ({ title, description }) => description && ( -
- +
+ {title} From 62b849846d388234af8c2cb3e1e8c8c09453fb57 Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 13 Oct 2020 07:14:03 -0700 Subject: [PATCH 40/85] Improved AlertsClient tests structure by splitting a huge alerts_client.tests.ts file into a specific files defined by its responsibility. (#80088) fairly large refactor, but no functional changes --- .../alerts/server/alerts_client.test.ts | 4567 ----------------- .../{ => alerts_client}/alerts_client.ts | 36 +- .../alerts/server/alerts_client/index.ts | 6 + .../server/alerts_client/tests/create.test.ts | 1097 ++++ .../server/alerts_client/tests/delete.test.ts | 204 + .../alerts_client/tests/disable.test.ts | 253 + .../server/alerts_client/tests/enable.test.ts | 361 ++ .../server/alerts_client/tests/find.test.ts | 251 + .../server/alerts_client/tests/get.test.ts | 194 + .../tests/get_alert_instance_summary.test.ts | 292 ++ .../tests/get_alert_state.test.ts | 239 + .../alerts/server/alerts_client/tests/lib.ts | 103 + .../tests/list_alert_types.test.ts | 134 + .../alerts_client/tests/mute_all.test.ts | 138 + .../alerts_client/tests/mute_instance.test.ts | 181 + .../alerts_client/tests/unmute_all.test.ts | 139 + .../tests/unmute_instance.test.ts | 179 + .../server/alerts_client/tests/update.test.ts | 1257 +++++ .../tests/update_api_key.test.ts | 229 + 19 files changed, 5275 insertions(+), 4585 deletions(-) delete mode 100644 x-pack/plugins/alerts/server/alerts_client.test.ts rename x-pack/plugins/alerts/server/{ => alerts_client}/alerts_client.ts (96%) create mode 100644 x-pack/plugins/alerts/server/alerts_client/index.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/create.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/delete.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/disable.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/enable.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/find.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/get.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/get_alert_instance_summary.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/get_alert_state.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/lib.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/list_alert_types.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/mute_all.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/mute_instance.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/unmute_all.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/unmute_instance.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/update.test.ts create mode 100644 x-pack/plugins/alerts/server/alerts_client/tests/update_api_key.test.ts diff --git a/x-pack/plugins/alerts/server/alerts_client.test.ts b/x-pack/plugins/alerts/server/alerts_client.test.ts deleted file mode 100644 index b20018fcc26f7..0000000000000 --- a/x-pack/plugins/alerts/server/alerts_client.test.ts +++ /dev/null @@ -1,4567 +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 uuid from 'uuid'; -import { schema } from '@kbn/config-schema'; -import { AlertsClient, CreateOptions, ConstructorOptions } from './alerts_client'; -import { savedObjectsClientMock, loggingSystemMock } from '../../../../src/core/server/mocks'; -import { nodeTypes } from '../../../../src/plugins/data/common'; -import { esKuery } from '../../../../src/plugins/data/server'; -import { taskManagerMock } from '../../task_manager/server/task_manager.mock'; -import { alertTypeRegistryMock } from './alert_type_registry.mock'; -import { alertsAuthorizationMock } from './authorization/alerts_authorization.mock'; -import { TaskStatus } from '../../task_manager/server'; -import { IntervalSchedule, RawAlert } from './types'; -import { resolvable } from './test_utils'; -import { encryptedSavedObjectsMock } from '../../encrypted_saved_objects/server/mocks'; -import { actionsClientMock, actionsAuthorizationMock } from '../../actions/server/mocks'; -import { AlertsAuthorization } from './authorization/alerts_authorization'; -import { ActionsAuthorization } from '../../actions/server'; -import { eventLogClientMock } from '../../event_log/server/mocks'; -import { QueryEventsBySavedObjectResult } from '../../event_log/server'; -import { SavedObject } from 'kibana/server'; -import { EventsFactory } from './lib/alert_instance_summary_from_event_log.test'; - -const taskManager = taskManagerMock.start(); -const alertTypeRegistry = alertTypeRegistryMock.create(); -const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); -const eventLogClient = eventLogClientMock.create(); - -const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); -const authorization = alertsAuthorizationMock.create(); -const actionsAuthorization = actionsAuthorizationMock.create(); - -const kibanaVersion = 'v7.10.0'; -const alertsClientParams: jest.Mocked = { - taskManager, - alertTypeRegistry, - unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertsAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, - spaceId: 'default', - namespace: 'default', - getUserName: jest.fn(), - createAPIKey: jest.fn(), - invalidateAPIKey: jest.fn(), - logger: loggingSystemMock.create().get(), - encryptedSavedObjectsClient: encryptedSavedObjects, - getActionsClient: jest.fn(), - getEventLogClient: jest.fn(), - kibanaVersion, -}; - -beforeEach(() => { - jest.resetAllMocks(); - alertsClientParams.createAPIKey.mockResolvedValue({ apiKeysEnabled: false }); - alertsClientParams.invalidateAPIKey.mockResolvedValue({ - apiKeysEnabled: true, - result: { - invalidated_api_keys: [], - previously_invalidated_api_keys: [], - error_count: 0, - }, - }); - alertsClientParams.getUserName.mockResolvedValue('elastic'); - taskManager.runNow.mockResolvedValue({ id: '' }); - const actionsClient = actionsClientMock.create(); - actionsClient.getBulk.mockResolvedValueOnce([ - { - id: '1', - isPreconfigured: false, - actionTypeId: 'test', - name: 'test', - config: { - foo: 'bar', - }, - }, - { - id: '2', - isPreconfigured: false, - actionTypeId: 'test2', - name: 'test2', - config: { - foo: 'bar', - }, - }, - { - id: 'testPreconfigured', - actionTypeId: '.slack', - isPreconfigured: true, - name: 'test', - }, - ]); - alertsClientParams.getActionsClient.mockResolvedValue(actionsClient); - - alertTypeRegistry.get.mockImplementation((id) => ({ - id: '123', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - async executor() {}, - producer: 'alerts', - })); - alertsClientParams.getEventLogClient.mockResolvedValue(eventLogClient); -}); - -const mockedDateString = '2019-02-12T21:01:22.479Z'; -const mockedDate = new Date(mockedDateString); -const DateOriginal = Date; - -// A version of date that responds to `new Date(null|undefined)` and `Date.now()` -// by returning a fixed date, otherwise should be same as Date. -/* eslint-disable-next-line @typescript-eslint/no-explicit-any */ -(global as any).Date = class Date { - constructor(...args: unknown[]) { - // sometimes the ctor has no args, sometimes has a single `null` arg - if (args[0] == null) { - // @ts-ignore - return mockedDate; - } else { - // @ts-ignore - return new DateOriginal(...args); - } - } - static now() { - return mockedDate.getTime(); - } - static parse(string: string) { - return DateOriginal.parse(string); - } -}; - -function getMockData(overwrites: Record = {}): CreateOptions['data'] { - return { - enabled: true, - name: 'abc', - tags: ['foo'], - alertTypeId: '123', - consumer: 'bar', - schedule: { interval: '10s' }, - throttle: null, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - ...overwrites, - }; -} - -describe('create()', () => { - let alertsClient: AlertsClient; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - }); - - describe('authorization', () => { - function tryToExecuteOperation(options: CreateOptions): Promise { - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: '2019-02-12T21:01:22.479Z', - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockResolvedValueOnce({ - id: 'task-123', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - scheduledTaskId: 'task-123', - }, - references: [ - { - id: '1', - name: 'action_0', - type: 'action', - }, - ], - }); - - return alertsClient.create(options); - } - - test('ensures user is authorised to create this type of alert under the consumer', async () => { - const data = getMockData({ - alertTypeId: 'myType', - consumer: 'myApp', - }); - - await tryToExecuteOperation({ data }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'create'); - }); - - test('throws when user is not authorised to create this type of alert', async () => { - const data = getMockData({ - alertTypeId: 'myType', - consumer: 'myApp', - }); - - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to create a "myType" alert for "myApp"`) - ); - - await expect(tryToExecuteOperation({ data })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to create a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'create'); - }); - }); - - test('creates an alert', async () => { - const data = getMockData(); - const createdAttributes = { - ...data, - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: '2019-02-12T21:01:22.479Z', - createdBy: 'elastic', - updatedBy: 'elastic', - muteAll: false, - mutedInstanceIds: [], - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }; - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: createdAttributes, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockResolvedValueOnce({ - id: 'task-123', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - ...createdAttributes, - scheduledTaskId: 'task-123', - }, - references: [ - { - id: '1', - name: 'action_0', - type: 'action', - }, - ], - }); - const result = await alertsClient.create({ data }); - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('123', 'bar', 'create'); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "123", - "consumer": "bar", - "createdAt": 2019-02-12T21:01:22.479Z, - "createdBy": "elastic", - "enabled": true, - "id": "1", - "muteAll": false, - "mutedInstanceIds": Array [], - "name": "abc", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "tags": Array [ - "foo", - ], - "throttle": null, - "updatedAt": 2019-02-12T21:01:22.479Z, - "updatedBy": "elastic", - } - `); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionRef": "action_0", - "actionTypeId": "test", - "group": "default", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "123", - "apiKey": null, - "apiKeyOwner": null, - "consumer": "bar", - "createdAt": "2019-02-12T21:01:22.479Z", - "createdBy": "elastic", - "enabled": true, - "executionStatus": Object { - "error": null, - "lastExecutionDate": "2019-02-12T21:01:22.479Z", - "status": "pending", - }, - "meta": Object { - "versionApiKeyLastmodified": "v7.10.0", - }, - "muteAll": false, - "mutedInstanceIds": Array [], - "name": "abc", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "tags": Array [ - "foo", - ], - "throttle": null, - "updatedBy": "elastic", - } - `); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` - Object { - "references": Array [ - Object { - "id": "1", - "name": "action_0", - "type": "action", - }, - ], - } - `); - expect(taskManager.schedule).toHaveBeenCalledTimes(1); - expect(taskManager.schedule.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "params": Object { - "alertId": "1", - "spaceId": "default", - }, - "scope": Array [ - "alerting", - ], - "state": Object { - "alertInstances": Object {}, - "alertTypeState": Object {}, - "previousStartedAt": null, - }, - "taskType": "alerting:123", - }, - ] - `); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.update.mock.calls[0]).toHaveLength(3); - expect(unsecuredSavedObjectsClient.update.mock.calls[0][0]).toEqual('alert'); - expect(unsecuredSavedObjectsClient.update.mock.calls[0][1]).toEqual('1'); - expect(unsecuredSavedObjectsClient.update.mock.calls[0][2]).toMatchInlineSnapshot(` - Object { - "scheduledTaskId": "task-123", - } - `); - }); - - test('creates an alert with multiple actions', async () => { - const data = getMockData({ - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '2', - params: { - foo: true, - }, - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - { - group: 'default', - actionRef: 'action_1', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - { - group: 'default', - actionRef: 'action_2', - actionTypeId: 'test2', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - { - name: 'action_1', - type: 'action', - id: '1', - }, - { - name: 'action_2', - type: 'action', - id: '2', - }, - ], - }); - taskManager.schedule.mockResolvedValueOnce({ - id: 'task-123', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - scheduledTaskId: 'task-123', - }, - references: [], - }); - const result = await alertsClient.create({ data }); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - Object { - "actionTypeId": "test2", - "group": "default", - "id": "2", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "123", - "createdAt": 2019-02-12T21:01:22.479Z, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "updatedAt": 2019-02-12T21:01:22.479Z, - } - `); - }); - - test('creates a disabled alert', async () => { - const data = getMockData({ enabled: false }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: false, - alertTypeId: '123', - schedule: { interval: 10000 }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - const result = await alertsClient.create({ data }); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "123", - "createdAt": 2019-02-12T21:01:22.479Z, - "enabled": false, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": 10000, - }, - "updatedAt": 2019-02-12T21:01:22.479Z, - } - `); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); - expect(taskManager.schedule).toHaveBeenCalledTimes(0); - }); - - test('should trim alert name when creating API key', async () => { - const data = getMockData({ name: ' my alert name ' }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: false, - name: ' my alert name ', - alertTypeId: '123', - schedule: { interval: 10000 }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockResolvedValueOnce({ - id: 'task-123', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - - await alertsClient.create({ data }); - expect(alertsClientParams.createAPIKey).toHaveBeenCalledWith('Alerting: 123/my alert name'); - }); - - test('should validate params', async () => { - const data = getMockData(); - alertTypeRegistry.get.mockReturnValue({ - id: '123', - name: 'Test', - actionGroups: [ - { - id: 'default', - name: 'Default', - }, - ], - defaultActionGroupId: 'default', - validate: { - params: schema.object({ - param1: schema.string(), - threshold: schema.number({ min: 0, max: 1 }), - }), - }, - async executor() {}, - producer: 'alerts', - }); - await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"params invalid: [param1]: expected value of type [string] but got [undefined]"` - ); - }); - - test('throws error if loading actions fails', async () => { - const data = getMockData(); - const actionsClient = actionsClientMock.create(); - actionsClient.getBulk.mockRejectedValueOnce(new Error('Test Error')); - alertsClientParams.getActionsClient.mockResolvedValue(actionsClient); - await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Test Error"` - ); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - expect(taskManager.schedule).not.toHaveBeenCalled(); - }); - - test('throws error and invalidates API key when create saved object fails', async () => { - const data = getMockData(); - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '123', name: '123', api_key: 'abc' }, - }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockRejectedValueOnce(new Error('Test failure')); - await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Test failure"` - ); - expect(taskManager.schedule).not.toHaveBeenCalled(); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - }); - - test('attempts to remove saved object if scheduling failed', async () => { - const data = getMockData(); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockRejectedValueOnce(new Error('Test failure')); - unsecuredSavedObjectsClient.delete.mockResolvedValueOnce({}); - await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Test failure"` - ); - expect(unsecuredSavedObjectsClient.delete).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.delete.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "alert", - "1", - ] - `); - }); - - test('returns task manager error if cleanup fails, logs to console', async () => { - const data = getMockData(); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockRejectedValueOnce(new Error('Task manager error')); - unsecuredSavedObjectsClient.delete.mockRejectedValueOnce( - new Error('Saved object delete error') - ); - await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Task manager error"` - ); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'Failed to cleanup alert "1" after scheduling task failed. Error: Saved object delete error' - ); - }); - - test('throws an error if alert type not registerd', async () => { - const data = getMockData(); - alertTypeRegistry.get.mockImplementation(() => { - throw new Error('Invalid type'); - }); - await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Invalid type"` - ); - }); - - test('calls the API key function', async () => { - const data = getMockData(); - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '123', name: '123', api_key: 'abc' }, - }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockResolvedValueOnce({ - id: 'task-123', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - scheduledTaskId: 'task-123', - }, - references: [ - { - id: '1', - name: 'action_0', - type: 'action', - }, - ], - }); - await alertsClient.create({ data }); - - expect(alertsClientParams.createAPIKey).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledWith( - 'alert', - { - actions: [ - { - actionRef: 'action_0', - group: 'default', - actionTypeId: 'test', - params: { foo: true }, - }, - ], - alertTypeId: '123', - consumer: 'bar', - name: 'abc', - params: { bar: true }, - apiKey: Buffer.from('123:abc').toString('base64'), - apiKeyOwner: 'elastic', - createdBy: 'elastic', - createdAt: '2019-02-12T21:01:22.479Z', - updatedBy: 'elastic', - enabled: true, - meta: { - versionApiKeyLastmodified: 'v7.10.0', - }, - schedule: { interval: '10s' }, - throttle: null, - muteAll: false, - mutedInstanceIds: [], - tags: ['foo'], - executionStatus: { - lastExecutionDate: '2019-02-12T21:01:22.479Z', - status: 'pending', - error: null, - }, - }, - { - references: [ - { - id: '1', - name: 'action_0', - type: 'action', - }, - ], - } - ); - }); - - test(`doesn't create API key for disabled alerts`, async () => { - const data = getMockData({ enabled: false }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - taskManager.schedule.mockResolvedValueOnce({ - id: 'task-123', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - scheduledTaskId: 'task-123', - }, - references: [ - { - id: '1', - name: 'action_0', - type: 'action', - }, - ], - }); - await alertsClient.create({ data }); - - expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledWith( - 'alert', - { - actions: [ - { - actionRef: 'action_0', - group: 'default', - actionTypeId: 'test', - params: { foo: true }, - }, - ], - alertTypeId: '123', - consumer: 'bar', - name: 'abc', - params: { bar: true }, - apiKey: null, - apiKeyOwner: null, - createdBy: 'elastic', - createdAt: '2019-02-12T21:01:22.479Z', - updatedBy: 'elastic', - enabled: false, - meta: { - versionApiKeyLastmodified: 'v7.10.0', - }, - schedule: { interval: '10s' }, - throttle: null, - muteAll: false, - mutedInstanceIds: [], - tags: ['foo'], - executionStatus: { - lastExecutionDate: '2019-02-12T21:01:22.479Z', - status: 'pending', - error: null, - }, - }, - { - references: [ - { - id: '1', - name: 'action_0', - type: 'action', - }, - ], - } - ); - }); -}); - -describe('enable()', () => { - let alertsClient: AlertsClient; - const existingAlert = { - id: '1', - type: 'alert', - attributes: { - consumer: 'myApp', - schedule: { interval: '10s' }, - alertTypeId: 'myType', - enabled: false, - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - version: '123', - references: [], - }; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingAlert); - unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); - alertsClientParams.createAPIKey.mockResolvedValue({ - apiKeysEnabled: false, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - enabled: true, - apiKey: null, - apiKeyOwner: null, - updatedBy: 'elastic', - }, - }); - taskManager.schedule.mockResolvedValue({ - id: 'task-123', - scheduledAt: new Date(), - attempts: 0, - status: TaskStatus.Idle, - runAt: new Date(), - state: {}, - params: {}, - taskType: '', - startedAt: null, - retryAt: null, - ownerId: null, - }); - }); - - describe('authorization', () => { - beforeEach(() => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingAlert); - unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); - alertsClientParams.createAPIKey.mockResolvedValue({ - apiKeysEnabled: false, - }); - taskManager.schedule.mockResolvedValue({ - id: 'task-123', - scheduledAt: new Date(), - attempts: 0, - status: TaskStatus.Idle, - runAt: new Date(), - state: {}, - params: {}, - taskType: '', - startedAt: null, - retryAt: null, - ownerId: null, - }); - }); - - test('ensures user is authorised to enable this type of alert under the consumer', async () => { - await alertsClient.enable({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'enable'); - expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); - }); - - test('throws when user is not authorised to enable this type of alert', async () => { - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to enable a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.enable({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to enable a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'enable'); - }); - }); - - test('enables an alert', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - enabled: true, - apiKey: null, - apiKeyOwner: null, - updatedBy: 'elastic', - }, - }); - - await alertsClient.enable({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - schedule: { interval: '10s' }, - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - meta: { - versionApiKeyLastmodified: kibanaVersion, - }, - updatedBy: 'elastic', - apiKey: null, - apiKeyOwner: null, - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - { - version: '123', - } - ); - expect(taskManager.schedule).toHaveBeenCalledWith({ - taskType: `alerting:myType`, - params: { - alertId: '1', - spaceId: 'default', - }, - state: { - alertInstances: {}, - alertTypeState: {}, - previousStartedAt: null, - }, - scope: ['alerting'], - }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith('alert', '1', { - scheduledTaskId: 'task-123', - }); - }); - - test('invalidates API key if ever one existed prior to updating', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: Buffer.from('123:abc').toString('base64'), - }, - }); - - await alertsClient.enable({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - }); - - test(`doesn't enable already enabled alerts`, async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - enabled: true, - }, - }); - - await alertsClient.enable({ id: '1' }); - expect(alertsClientParams.getUserName).not.toHaveBeenCalled(); - expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - expect(taskManager.schedule).not.toHaveBeenCalled(); - }); - - test('sets API key when createAPIKey returns one', async () => { - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '123', name: '123', api_key: 'abc' }, - }); - - await alertsClient.enable({ id: '1' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - schedule: { interval: '10s' }, - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - meta: { - versionApiKeyLastmodified: kibanaVersion, - }, - apiKey: Buffer.from('123:abc').toString('base64'), - apiKeyOwner: 'elastic', - updatedBy: 'elastic', - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - { - version: '123', - } - ); - }); - - test('falls back when failing to getDecryptedAsInternalUser', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); - - await alertsClient.enable({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'enable(): Failed to load API key to invalidate on alert 1: Fail' - ); - }); - - test('throws error when failing to load the saved object using SOC', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); - unsecuredSavedObjectsClient.get.mockRejectedValueOnce(new Error('Fail to get')); - - await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Fail to get"` - ); - expect(alertsClientParams.getUserName).not.toHaveBeenCalled(); - expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.update).not.toHaveBeenCalled(); - expect(taskManager.schedule).not.toHaveBeenCalled(); - }); - - test('throws error when failing to update the first time', async () => { - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '123', name: '123', api_key: 'abc' }, - }); - unsecuredSavedObjectsClient.update.mockReset(); - unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Fail to update')); - - await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Fail to update"` - ); - expect(alertsClientParams.getUserName).toHaveBeenCalled(); - expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(1); - expect(taskManager.schedule).not.toHaveBeenCalled(); - }); - - test('throws error when failing to update the second time', async () => { - unsecuredSavedObjectsClient.update.mockReset(); - unsecuredSavedObjectsClient.update.mockResolvedValueOnce({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - enabled: true, - }, - }); - unsecuredSavedObjectsClient.update.mockRejectedValueOnce( - new Error('Fail to update second time') - ); - - await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Fail to update second time"` - ); - expect(alertsClientParams.getUserName).toHaveBeenCalled(); - expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(2); - expect(taskManager.schedule).toHaveBeenCalled(); - }); - - test('throws error when failing to schedule task', async () => { - taskManager.schedule.mockRejectedValueOnce(new Error('Fail to schedule')); - - await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Fail to schedule"` - ); - expect(alertsClientParams.getUserName).toHaveBeenCalled(); - expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); - }); -}); - -describe('disable()', () => { - let alertsClient: AlertsClient; - const existingAlert = { - id: '1', - type: 'alert', - attributes: { - consumer: 'myApp', - schedule: { interval: '10s' }, - alertTypeId: 'myType', - enabled: true, - scheduledTaskId: 'task-123', - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - version: '123', - references: [], - }; - const existingDecryptedAlert = { - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: Buffer.from('123:abc').toString('base64'), - }, - version: '123', - references: [], - }; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); - }); - - describe('authorization', () => { - test('ensures user is authorised to disable this type of alert under the consumer', async () => { - await alertsClient.disable({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'disable'); - }); - - test('throws when user is not authorised to disable this type of alert', async () => { - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to disable a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.disable({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to disable a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'disable'); - }); - }); - - test('disables an alert', async () => { - await alertsClient.disable({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - consumer: 'myApp', - schedule: { interval: '10s' }, - alertTypeId: 'myType', - enabled: false, - meta: { - versionApiKeyLastmodified: kibanaVersion, - }, - scheduledTaskId: null, - apiKey: null, - apiKeyOwner: null, - updatedBy: 'elastic', - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - { - version: '123', - } - ); - expect(taskManager.remove).toHaveBeenCalledWith('task-123'); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - }); - - test('falls back when getDecryptedAsInternalUser throws an error', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); - - await alertsClient.disable({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - consumer: 'myApp', - schedule: { interval: '10s' }, - alertTypeId: 'myType', - enabled: false, - meta: { - versionApiKeyLastmodified: kibanaVersion, - }, - scheduledTaskId: null, - apiKey: null, - apiKeyOwner: null, - updatedBy: 'elastic', - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - { - version: '123', - } - ); - expect(taskManager.remove).toHaveBeenCalledWith('task-123'); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - }); - - test(`doesn't disable already disabled alerts`, async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ - ...existingDecryptedAlert, - attributes: { - ...existingDecryptedAlert.attributes, - actions: [], - enabled: false, - }, - }); - - await alertsClient.disable({ id: '1' }); - expect(unsecuredSavedObjectsClient.update).not.toHaveBeenCalled(); - expect(taskManager.remove).not.toHaveBeenCalled(); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - }); - - test(`doesn't invalidate when no API key is used`, async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce(existingAlert); - - await alertsClient.disable({ id: '1' }); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - }); - - test('swallows error when failing to load decrypted saved object', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); - - await alertsClient.disable({ id: '1' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); - expect(taskManager.remove).toHaveBeenCalled(); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'disable(): Failed to load API key to invalidate on alert 1: Fail' - ); - }); - - test('throws when unsecuredSavedObjectsClient update fails', async () => { - unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Failed to update')); - - await expect(alertsClient.disable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Failed to update"` - ); - }); - - test('swallows error when invalidate API key throws', async () => { - alertsClientParams.invalidateAPIKey.mockRejectedValueOnce(new Error('Fail')); - - await alertsClient.disable({ id: '1' }); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'Failed to invalidate API Key: Fail' - ); - }); - - test('throws when failing to remove task from task manager', async () => { - taskManager.remove.mockRejectedValueOnce(new Error('Failed to remove task')); - - await expect(alertsClient.disable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Failed to remove task"` - ); - }); -}); - -describe('muteAll()', () => { - test('mutes an alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - muteAll: false, - }, - references: [], - version: '123', - }); - - await alertsClient.muteAll({ id: '1' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - muteAll: true, - mutedInstanceIds: [], - updatedBy: 'elastic', - }, - { - version: '123', - } - ); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - consumer: 'myApp', - schedule: { interval: '10s' }, - alertTypeId: 'myType', - apiKey: null, - apiKeyOwner: null, - enabled: false, - scheduledTaskId: null, - updatedBy: 'elastic', - muteAll: false, - }, - references: [], - }); - }); - - test('ensures user is authorised to muteAll this type of alert under the consumer', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.muteAll({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'muteAll'); - expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); - }); - - test('throws when user is not authorised to muteAll this type of alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to muteAll a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.muteAll({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to muteAll a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'muteAll'); - }); - }); -}); - -describe('unmuteAll()', () => { - test('unmutes an alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - muteAll: true, - }, - references: [], - version: '123', - }); - - await alertsClient.unmuteAll({ id: '1' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - muteAll: false, - mutedInstanceIds: [], - updatedBy: 'elastic', - }, - { - version: '123', - } - ); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - consumer: 'myApp', - schedule: { interval: '10s' }, - alertTypeId: 'myType', - apiKey: null, - apiKeyOwner: null, - enabled: false, - scheduledTaskId: null, - updatedBy: 'elastic', - muteAll: false, - }, - references: [], - }); - }); - - test('ensures user is authorised to unmuteAll this type of alert under the consumer', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.unmuteAll({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'unmuteAll'); - expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); - }); - - test('throws when user is not authorised to unmuteAll this type of alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to unmuteAll a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.unmuteAll({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to unmuteAll a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'unmuteAll'); - }); - }); -}); - -describe('muteInstance()', () => { - test('mutes an alert instance', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - schedule: { interval: '10s' }, - alertTypeId: '2', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: [], - }, - version: '123', - references: [], - }); - - await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - mutedInstanceIds: ['2'], - updatedBy: 'elastic', - }, - { - version: '123', - } - ); - }); - - test('skips muting when alert instance already muted', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - schedule: { interval: '10s' }, - alertTypeId: '2', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: ['2'], - }, - references: [], - }); - - await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - }); - - test('skips muting when alert is muted', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - schedule: { interval: '10s' }, - alertTypeId: '2', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: [], - muteAll: true, - }, - references: [], - }); - - await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - schedule: { interval: '10s' }, - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: [], - }, - version: '123', - references: [], - }); - }); - - test('ensures user is authorised to muteInstance this type of alert under the consumer', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); - - expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'muteInstance' - ); - }); - - test('throws when user is not authorised to muteInstance this type of alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to muteInstance a "myType" alert for "myApp"`) - ); - - await expect( - alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }) - ).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to muteInstance a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'muteInstance' - ); - }); - }); -}); - -describe('unmuteInstance()', () => { - test('unmutes an alert instance', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - schedule: { interval: '10s' }, - alertTypeId: '2', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: ['2'], - }, - version: '123', - references: [], - }); - - await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - mutedInstanceIds: [], - updatedBy: 'elastic', - }, - { version: '123' } - ); - }); - - test('skips unmuting when alert instance not muted', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - schedule: { interval: '10s' }, - alertTypeId: '2', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: [], - }, - references: [], - }); - - await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - }); - - test('skips unmuting when alert is muted', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [], - schedule: { interval: '10s' }, - alertTypeId: '2', - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: [], - muteAll: true, - }, - references: [], - }); - - await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); - expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - alertTypeId: 'myType', - consumer: 'myApp', - schedule: { interval: '10s' }, - enabled: true, - scheduledTaskId: 'task-123', - mutedInstanceIds: ['2'], - }, - version: '123', - references: [], - }); - }); - - test('ensures user is authorised to unmuteInstance this type of alert under the consumer', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); - - expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'unmuteInstance' - ); - }); - - test('throws when user is not authorised to unmuteInstance this type of alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to unmuteInstance a "myType" alert for "myApp"`) - ); - - await expect( - alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }) - ).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to unmuteInstance a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'unmuteInstance' - ); - }); - }); -}); - -describe('get()', () => { - test('calls saved objects client with given params', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - const result = await alertsClient.get({ id: '1' }); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "123", - "createdAt": 2019-02-12T21:01:22.479Z, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "updatedAt": 2019-02-12T21:01:22.479Z, - } - `); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.get.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "alert", - "1", - ] - `); - }); - - test(`throws an error when references aren't found`, async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - references: [], - }); - await expect(alertsClient.get({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Action reference \\"action_0\\" not found in alert id: 1"` - ); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: 'myType', - consumer: 'myApp', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - }); - - test('ensures user is authorised to get this type of alert under the consumer', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.get({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'get'); - }); - - test('throws when user is not authorised to get this type of alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to get a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.get({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to get a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'get'); - }); - }); -}); - -describe('getAlertState()', () => { - test('calls saved objects client with given params', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - - taskManager.get.mockResolvedValueOnce({ - id: '1', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - - await alertsClient.getAlertState({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.get.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "alert", - "1", - ] - `); - }); - - test('gets the underlying task from TaskManager', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - - const scheduledTaskId = 'task-123'; - - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: '123', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - enabled: true, - scheduledTaskId, - mutedInstanceIds: [], - muteAll: true, - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - - taskManager.get.mockResolvedValueOnce({ - id: scheduledTaskId, - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: { - alertId: '1', - }, - ownerId: null, - }); - - await alertsClient.getAlertState({ id: '1' }); - expect(taskManager.get).toHaveBeenCalledTimes(1); - expect(taskManager.get).toHaveBeenCalledWith(scheduledTaskId); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: 'myType', - consumer: 'myApp', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - - taskManager.get.mockResolvedValueOnce({ - id: '1', - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - }); - - test('ensures user is authorised to get this type of alert under the consumer', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.getAlertState({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'getAlertState' - ); - }); - - test('throws when user is not authorised to getAlertState this type of alert', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - // `get` check - authorization.ensureAuthorized.mockResolvedValueOnce(); - // `getAlertState` check - authorization.ensureAuthorized.mockRejectedValueOnce( - new Error(`Unauthorized to getAlertState a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.getAlertState({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to getAlertState a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'getAlertState' - ); - }); - }); -}); - -const AlertInstanceSummaryFindEventsResult: QueryEventsBySavedObjectResult = { - page: 1, - per_page: 10000, - total: 0, - data: [], -}; - -const AlertInstanceSummaryIntervalSeconds = 1; - -const BaseAlertInstanceSummarySavedObject: SavedObject = { - id: '1', - type: 'alert', - attributes: { - enabled: true, - name: 'alert-name', - tags: ['tag-1', 'tag-2'], - alertTypeId: '123', - consumer: 'alert-consumer', - schedule: { interval: `${AlertInstanceSummaryIntervalSeconds}s` }, - actions: [], - params: {}, - createdBy: null, - updatedBy: null, - createdAt: mockedDateString, - apiKey: null, - apiKeyOwner: null, - throttle: null, - muteAll: false, - mutedInstanceIds: [], - executionStatus: { - status: 'unknown', - lastExecutionDate: '2020-08-20T19:23:38Z', - error: null, - }, - }, - references: [], -}; - -function getAlertInstanceSummarySavedObject( - attributes: Partial = {} -): SavedObject { - return { - ...BaseAlertInstanceSummarySavedObject, - attributes: { ...BaseAlertInstanceSummarySavedObject.attributes, ...attributes }, - }; -} - -describe('getAlertInstanceSummary()', () => { - let alertsClient: AlertsClient; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - }); - - test('runs as expected with some event log data', async () => { - const alertSO = getAlertInstanceSummarySavedObject({ - mutedInstanceIds: ['instance-muted-no-activity'], - }); - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(alertSO); - - const eventsFactory = new EventsFactory(mockedDateString); - const events = eventsFactory - .addExecute() - .addNewInstance('instance-currently-active') - .addNewInstance('instance-previously-active') - .addActiveInstance('instance-currently-active') - .addActiveInstance('instance-previously-active') - .advanceTime(10000) - .addExecute() - .addResolvedInstance('instance-previously-active') - .addActiveInstance('instance-currently-active') - .getEvents(); - const eventsResult = { - ...AlertInstanceSummaryFindEventsResult, - total: events.length, - data: events, - }; - eventLogClient.findEventsBySavedObject.mockResolvedValueOnce(eventsResult); - - const dateStart = new Date(Date.now() - 60 * 1000).toISOString(); - - const result = await alertsClient.getAlertInstanceSummary({ id: '1', dateStart }); - expect(result).toMatchInlineSnapshot(` - Object { - "alertTypeId": "123", - "consumer": "alert-consumer", - "enabled": true, - "errorMessages": Array [], - "id": "1", - "instances": Object { - "instance-currently-active": Object { - "activeStartDate": "2019-02-12T21:01:22.479Z", - "muted": false, - "status": "Active", - }, - "instance-muted-no-activity": Object { - "activeStartDate": undefined, - "muted": true, - "status": "OK", - }, - "instance-previously-active": Object { - "activeStartDate": undefined, - "muted": false, - "status": "OK", - }, - }, - "lastRun": "2019-02-12T21:01:32.479Z", - "muteAll": false, - "name": "alert-name", - "status": "Active", - "statusEndDate": "2019-02-12T21:01:22.479Z", - "statusStartDate": "2019-02-12T21:00:22.479Z", - "tags": Array [ - "tag-1", - "tag-2", - ], - "throttle": null, - } - `); - }); - - // Further tests don't check the result of `getAlertInstanceSummary()`, as the result - // is just the result from the `alertInstanceSummaryFromEventLog()`, which itself - // has a complete set of tests. These tests just make sure the data gets - // sent into `getAlertInstanceSummary()` as appropriate. - - test('calls saved objects and event log client with default params', async () => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); - eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( - AlertInstanceSummaryFindEventsResult - ); - - await alertsClient.getAlertInstanceSummary({ id: '1' }); - - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObject).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObject.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - "alert", - "1", - Object { - "end": "2019-02-12T21:01:22.479Z", - "page": 1, - "per_page": 10000, - "sort_order": "desc", - "start": "2019-02-12T21:00:22.479Z", - }, - ] - `); - // calculate the expected start/end date for one test - const { start, end } = eventLogClient.findEventsBySavedObject.mock.calls[0][2]!; - expect(end).toBe(mockedDateString); - - const startMillis = Date.parse(start!); - const endMillis = Date.parse(end!); - const expectedDuration = 60 * AlertInstanceSummaryIntervalSeconds * 1000; - expect(endMillis - startMillis).toBeGreaterThan(expectedDuration - 2); - expect(endMillis - startMillis).toBeLessThan(expectedDuration + 2); - }); - - test('calls event log client with start date', async () => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); - eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( - AlertInstanceSummaryFindEventsResult - ); - - const dateStart = new Date( - Date.now() - 60 * AlertInstanceSummaryIntervalSeconds * 1000 - ).toISOString(); - await alertsClient.getAlertInstanceSummary({ id: '1', dateStart }); - - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObject).toHaveBeenCalledTimes(1); - const { start, end } = eventLogClient.findEventsBySavedObject.mock.calls[0][2]!; - - expect({ start, end }).toMatchInlineSnapshot(` - Object { - "end": "2019-02-12T21:01:22.479Z", - "start": "2019-02-12T21:00:22.479Z", - } - `); - }); - - test('calls event log client with relative start date', async () => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); - eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( - AlertInstanceSummaryFindEventsResult - ); - - const dateStart = '2m'; - await alertsClient.getAlertInstanceSummary({ id: '1', dateStart }); - - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObject).toHaveBeenCalledTimes(1); - const { start, end } = eventLogClient.findEventsBySavedObject.mock.calls[0][2]!; - - expect({ start, end }).toMatchInlineSnapshot(` - Object { - "end": "2019-02-12T21:01:22.479Z", - "start": "2019-02-12T20:59:22.479Z", - } - `); - }); - - test('invalid start date throws an error', async () => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); - eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( - AlertInstanceSummaryFindEventsResult - ); - - const dateStart = 'ain"t no way this will get parsed as a date'; - expect( - alertsClient.getAlertInstanceSummary({ id: '1', dateStart }) - ).rejects.toMatchInlineSnapshot( - `[Error: Invalid date for parameter dateStart: "ain"t no way this will get parsed as a date"]` - ); - }); - - test('saved object get throws an error', async () => { - unsecuredSavedObjectsClient.get.mockRejectedValueOnce(new Error('OMG!')); - eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( - AlertInstanceSummaryFindEventsResult - ); - - expect(alertsClient.getAlertInstanceSummary({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: OMG!]` - ); - }); - - test('findEvents throws an error', async () => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); - eventLogClient.findEventsBySavedObject.mockRejectedValueOnce(new Error('OMG 2!')); - - // error eaten but logged - await alertsClient.getAlertInstanceSummary({ id: '1' }); - }); -}); - -describe('find()', () => { - const listedTypes = new Set([ - { - actionGroups: [], - actionVariables: undefined, - defaultActionGroupId: 'default', - id: 'myType', - name: 'myType', - producer: 'myApp', - }, - ]); - beforeEach(() => { - authorization.getFindAuthorizationFilter.mockResolvedValue({ - ensureAlertTypeIsAuthorized() {}, - logSuccessfulAuthorization() {}, - }); - unsecuredSavedObjectsClient.find.mockResolvedValueOnce({ - total: 1, - per_page: 10, - page: 1, - saved_objects: [ - { - id: '1', - type: 'alert', - attributes: { - alertTypeId: 'myType', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - score: 1, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }, - ], - }); - alertTypeRegistry.list.mockReturnValue(listedTypes); - authorization.filterByAlertTypeAuthorization.mockResolvedValue( - new Set([ - { - id: 'myType', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - producer: 'alerts', - authorizedConsumers: { - myApp: { read: true, all: true }, - }, - }, - ]) - ); - }); - - test('calls saved objects client with given params', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - const result = await alertsClient.find({ options: {} }); - expect(result).toMatchInlineSnapshot(` - Object { - "data": Array [ - Object { - "actions": Array [ - Object { - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "myType", - "createdAt": 2019-02-12T21:01:22.479Z, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "updatedAt": 2019-02-12T21:01:22.479Z, - }, - ], - "page": 1, - "perPage": 10, - "total": 1, - } - `); - expect(unsecuredSavedObjectsClient.find).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.find.mock.calls[0]).toMatchInlineSnapshot(` - Array [ - Object { - "fields": undefined, - "filter": undefined, - "type": "alert", - }, - ] - `); - }); - - describe('authorization', () => { - test('ensures user is query filter types down to those the user is authorized to find', async () => { - const filter = esKuery.fromKueryExpression( - '((alert.attributes.alertTypeId:myType and alert.attributes.consumer:myApp) or (alert.attributes.alertTypeId:myOtherType and alert.attributes.consumer:myApp) or (alert.attributes.alertTypeId:myOtherType and alert.attributes.consumer:myOtherApp))' - ); - authorization.getFindAuthorizationFilter.mockResolvedValue({ - filter, - ensureAlertTypeIsAuthorized() {}, - logSuccessfulAuthorization() {}, - }); - - const alertsClient = new AlertsClient(alertsClientParams); - await alertsClient.find({ options: { filter: 'someTerm' } }); - - const [options] = unsecuredSavedObjectsClient.find.mock.calls[0]; - expect(options.filter).toEqual( - nodeTypes.function.buildNode('and', [esKuery.fromKueryExpression('someTerm'), filter]) - ); - expect(authorization.getFindAuthorizationFilter).toHaveBeenCalledTimes(1); - }); - - test('throws if user is not authorized to find any types', async () => { - const alertsClient = new AlertsClient(alertsClientParams); - authorization.getFindAuthorizationFilter.mockRejectedValue(new Error('not authorized')); - await expect(alertsClient.find({ options: {} })).rejects.toThrowErrorMatchingInlineSnapshot( - `"not authorized"` - ); - }); - - test('ensures authorization even when the fields required to authorize are omitted from the find', async () => { - const ensureAlertTypeIsAuthorized = jest.fn(); - const logSuccessfulAuthorization = jest.fn(); - authorization.getFindAuthorizationFilter.mockResolvedValue({ - ensureAlertTypeIsAuthorized, - logSuccessfulAuthorization, - }); - - unsecuredSavedObjectsClient.find.mockReset(); - unsecuredSavedObjectsClient.find.mockResolvedValue({ - total: 1, - per_page: 10, - page: 1, - saved_objects: [ - { - id: '1', - type: 'alert', - attributes: { - actions: [], - alertTypeId: 'myType', - consumer: 'myApp', - tags: ['myTag'], - }, - score: 1, - references: [], - }, - ], - }); - - const alertsClient = new AlertsClient(alertsClientParams); - expect(await alertsClient.find({ options: { fields: ['tags'] } })).toMatchInlineSnapshot(` - Object { - "data": Array [ - Object { - "actions": Array [], - "id": "1", - "schedule": undefined, - "tags": Array [ - "myTag", - ], - }, - ], - "page": 1, - "perPage": 10, - "total": 1, - } - `); - - expect(unsecuredSavedObjectsClient.find).toHaveBeenCalledWith({ - fields: ['tags', 'alertTypeId', 'consumer'], - type: 'alert', - }); - expect(ensureAlertTypeIsAuthorized).toHaveBeenCalledWith('myType', 'myApp'); - expect(logSuccessfulAuthorization).toHaveBeenCalled(); - }); - }); -}); - -describe('delete()', () => { - let alertsClient: AlertsClient; - const existingAlert = { - id: '1', - type: 'alert', - attributes: { - alertTypeId: 'myType', - consumer: 'myApp', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - scheduledTaskId: 'task-123', - actions: [ - { - group: 'default', - actionTypeId: '.no-op', - actionRef: 'action_0', - params: { - foo: true, - }, - }, - ], - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }; - const existingDecryptedAlert = { - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: Buffer.from('123:abc').toString('base64'), - }, - }; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); - unsecuredSavedObjectsClient.delete.mockResolvedValue({ - success: true, - }); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); - }); - - test('successfully removes an alert', async () => { - const result = await alertsClient.delete({ id: '1' }); - expect(result).toEqual({ success: true }); - expect(unsecuredSavedObjectsClient.delete).toHaveBeenCalledWith('alert', '1'); - expect(taskManager.remove).toHaveBeenCalledWith('task-123'); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); - }); - - test('falls back to SOC.get when getDecryptedAsInternalUser throws an error', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); - - const result = await alertsClient.delete({ id: '1' }); - expect(result).toEqual({ success: true }); - expect(unsecuredSavedObjectsClient.delete).toHaveBeenCalledWith('alert', '1'); - expect(taskManager.remove).toHaveBeenCalledWith('task-123'); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'delete(): Failed to load API key to invalidate on alert 1: Fail' - ); - }); - - test(`doesn't remove a task when scheduledTaskId is null`, async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ - ...existingDecryptedAlert, - attributes: { - ...existingDecryptedAlert.attributes, - scheduledTaskId: null, - }, - }); - - await alertsClient.delete({ id: '1' }); - expect(taskManager.remove).not.toHaveBeenCalled(); - }); - - test(`doesn't invalidate API key when apiKey is null`, async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: null, - }, - }); - - await alertsClient.delete({ id: '1' }); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - }); - - test('swallows error when invalidate API key throws', async () => { - alertsClientParams.invalidateAPIKey.mockRejectedValueOnce(new Error('Fail')); - - await alertsClient.delete({ id: '1' }); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'Failed to invalidate API Key: Fail' - ); - }); - - test('swallows error when getDecryptedAsInternalUser throws an error', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); - - await alertsClient.delete({ id: '1' }); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'delete(): Failed to load API key to invalidate on alert 1: Fail' - ); - }); - - test('throws error when unsecuredSavedObjectsClient.get throws an error', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); - unsecuredSavedObjectsClient.get.mockRejectedValue(new Error('SOC Fail')); - - await expect(alertsClient.delete({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"SOC Fail"` - ); - }); - - test('throws error when taskManager.remove throws an error', async () => { - taskManager.remove.mockRejectedValue(new Error('TM Fail')); - - await expect(alertsClient.delete({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"TM Fail"` - ); - }); - - describe('authorization', () => { - test('ensures user is authorised to delete this type of alert under the consumer', async () => { - await alertsClient.delete({ id: '1' }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'delete'); - }); - - test('throws when user is not authorised to delete this type of alert', async () => { - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to delete a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.delete({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to delete a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'delete'); - }); - }); -}); - -describe('update()', () => { - let alertsClient: AlertsClient; - const existingAlert = { - id: '1', - type: 'alert', - attributes: { - enabled: true, - tags: ['foo'], - alertTypeId: 'myType', - schedule: { interval: '10s' }, - consumer: 'myApp', - scheduledTaskId: 'task-123', - params: {}, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - references: [], - version: '123', - }; - const existingDecryptedAlert = { - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: Buffer.from('123:abc').toString('base64'), - }, - }; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); - alertTypeRegistry.get.mockReturnValue({ - id: 'myType', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - async executor() {}, - producer: 'alerts', - }); - }); - - test('updates given parameters', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: true, - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - { - group: 'default', - actionRef: 'action_1', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - { - group: 'default', - actionRef: 'action_2', - actionTypeId: 'test2', - params: { - foo: true, - }, - }, - ], - scheduledTaskId: 'task-123', - createdAt: new Date().toISOString(), - }, - updated_at: new Date().toISOString(), - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - { - name: 'action_1', - type: 'action', - id: '1', - }, - { - name: 'action_2', - type: 'action', - id: '2', - }, - ], - }); - const result = await alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '2', - params: { - foo: true, - }, - }, - ], - }, - }); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - Object { - "actionTypeId": "test2", - "group": "default", - "id": "2", - "params": Object { - "foo": true, - }, - }, - ], - "createdAt": 2019-02-12T21:01:22.479Z, - "enabled": true, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "updatedAt": 2019-02-12T21:01:22.479Z, - } - `); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionRef": "action_0", - "actionTypeId": "test", - "group": "default", - "params": Object { - "foo": true, - }, - }, - Object { - "actionRef": "action_1", - "actionTypeId": "test", - "group": "default", - "params": Object { - "foo": true, - }, - }, - Object { - "actionRef": "action_2", - "actionTypeId": "test2", - "group": "default", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "myType", - "apiKey": null, - "apiKeyOwner": null, - "consumer": "myApp", - "enabled": true, - "meta": Object { - "versionApiKeyLastmodified": "v7.10.0", - }, - "name": "abc", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "tags": Array [ - "foo", - ], - "throttle": null, - "updatedBy": "elastic", - } - `); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` - Object { - "id": "1", - "overwrite": true, - "references": Array [ - Object { - "id": "1", - "name": "action_0", - "type": "action", - }, - Object { - "id": "1", - "name": "action_1", - "type": "action", - }, - Object { - "id": "2", - "name": "action_2", - "type": "action", - }, - ], - "version": "123", - } - `); - }); - - it('calls the createApiKey function', async () => { - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '123', name: '123', api_key: 'abc' }, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: true, - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - apiKey: Buffer.from('123:abc').toString('base64'), - scheduledTaskId: 'task-123', - }, - updated_at: new Date().toISOString(), - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - const result = await alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: '5m', - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - ], - "apiKey": "MTIzOmFiYw==", - "createdAt": 2019-02-12T21:01:22.479Z, - "enabled": true, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "updatedAt": 2019-02-12T21:01:22.479Z, - } - `); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionRef": "action_0", - "actionTypeId": "test", - "group": "default", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "myType", - "apiKey": "MTIzOmFiYw==", - "apiKeyOwner": "elastic", - "consumer": "myApp", - "enabled": true, - "meta": Object { - "versionApiKeyLastmodified": "v7.10.0", - }, - "name": "abc", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "tags": Array [ - "foo", - ], - "throttle": "5m", - "updatedBy": "elastic", - } - `); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` - Object { - "id": "1", - "overwrite": true, - "references": Array [ - Object { - "id": "1", - "name": "action_0", - "type": "action", - }, - ], - "version": "123", - } - `); - }); - - it(`doesn't call the createAPIKey function when alert is disabled`, async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ - ...existingDecryptedAlert, - attributes: { - ...existingDecryptedAlert.attributes, - enabled: false, - }, - }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: false, - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - scheduledTaskId: 'task-123', - apiKey: null, - }, - updated_at: new Date().toISOString(), - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - const result = await alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: '5m', - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); - expect(result).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionTypeId": "test", - "group": "default", - "id": "1", - "params": Object { - "foo": true, - }, - }, - ], - "apiKey": null, - "createdAt": 2019-02-12T21:01:22.479Z, - "enabled": false, - "id": "1", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "updatedAt": 2019-02-12T21:01:22.479Z, - } - `); - expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` - Object { - "actions": Array [ - Object { - "actionRef": "action_0", - "actionTypeId": "test", - "group": "default", - "params": Object { - "foo": true, - }, - }, - ], - "alertTypeId": "myType", - "apiKey": null, - "apiKeyOwner": null, - "consumer": "myApp", - "enabled": false, - "meta": Object { - "versionApiKeyLastmodified": "v7.10.0", - }, - "name": "abc", - "params": Object { - "bar": true, - }, - "schedule": Object { - "interval": "10s", - }, - "scheduledTaskId": "task-123", - "tags": Array [ - "foo", - ], - "throttle": "5m", - "updatedBy": "elastic", - } - `); - expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` - Object { - "id": "1", - "overwrite": true, - "references": Array [ - Object { - "id": "1", - "name": "action_0", - "type": "action", - }, - ], - "version": "123", - } - `); - }); - - it('should validate params', async () => { - alertTypeRegistry.get.mockReturnValueOnce({ - id: '123', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - validate: { - params: schema.object({ - param1: schema.string(), - }), - }, - async executor() {}, - producer: 'alerts', - }); - await expect( - alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }) - ).rejects.toThrowErrorMatchingInlineSnapshot( - `"params invalid: [param1]: expected value of type [string] but got [undefined]"` - ); - }); - - it('should trim alert name in the API key name', async () => { - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: false, - name: ' my alert name ', - schedule: { interval: '10s' }, - params: { - bar: true, - }, - createdAt: new Date().toISOString(), - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - scheduledTaskId: 'task-123', - apiKey: null, - }, - updated_at: new Date().toISOString(), - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - await alertsClient.update({ - id: '1', - data: { - ...existingAlert.attributes, - name: ' my alert name ', - }, - }); - - expect(alertsClientParams.createAPIKey).toHaveBeenCalledWith('Alerting: myType/my alert name'); - }); - - it('swallows error when invalidate API key throws', async () => { - alertsClientParams.invalidateAPIKey.mockRejectedValueOnce(new Error('Fail')); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: true, - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - scheduledTaskId: 'task-123', - }, - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - ], - }); - await alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'Failed to invalidate API Key: Fail' - ); - }); - - it('swallows error when getDecryptedAsInternalUser throws', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - { - id: '2', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test2', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - enabled: true, - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - { - group: 'default', - actionRef: 'action_1', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - { - group: 'default', - actionRef: 'action_2', - actionTypeId: 'test2', - params: { - foo: true, - }, - }, - ], - scheduledTaskId: 'task-123', - createdAt: new Date().toISOString(), - }, - updated_at: new Date().toISOString(), - references: [ - { - name: 'action_0', - type: 'action', - id: '1', - }, - { - name: 'action_1', - type: 'action', - id: '1', - }, - { - name: 'action_2', - type: 'action', - id: '2', - }, - ], - }); - await alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: '5m', - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - { - group: 'default', - id: '2', - params: { - foo: true, - }, - }, - ], - }, - }); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'update(): Failed to load API key to invalidate on alert 1: Fail' - ); - }); - - test('throws when unsecuredSavedObjectsClient update fails and invalidates newly created API key', async () => { - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '234', name: '234', api_key: 'abc' }, - }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - unsecuredSavedObjectsClient.create.mockRejectedValue(new Error('Fail')); - await expect( - alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }) - ).rejects.toThrowErrorMatchingInlineSnapshot(`"Fail"`); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalledWith({ id: '123' }); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '234' }); - }); - - describe('updating an alert schedule', () => { - function mockApiCalls( - alertId: string, - taskId: string, - currentSchedule: IntervalSchedule, - updatedSchedule: IntervalSchedule - ) { - // mock return values from deps - alertTypeRegistry.get.mockReturnValueOnce({ - id: '123', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - async executor() {}, - producer: 'alerts', - }); - unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ - saved_objects: [ - { - id: '1', - type: 'action', - attributes: { - actions: [], - actionTypeId: 'test', - }, - references: [], - }, - ], - }); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: alertId, - type: 'alert', - attributes: { - actions: [], - enabled: true, - alertTypeId: '123', - schedule: currentSchedule, - scheduledTaskId: 'task-123', - }, - references: [], - version: '123', - }); - - taskManager.schedule.mockResolvedValueOnce({ - id: taskId, - taskType: 'alerting:123', - scheduledAt: new Date(), - attempts: 1, - status: TaskStatus.Idle, - runAt: new Date(), - startedAt: null, - retryAt: null, - state: {}, - params: {}, - ownerId: null, - }); - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: alertId, - type: 'alert', - attributes: { - enabled: true, - schedule: updatedSchedule, - actions: [ - { - group: 'default', - actionRef: 'action_0', - actionTypeId: 'test', - params: { - foo: true, - }, - }, - ], - scheduledTaskId: taskId, - }, - references: [ - { - name: 'action_0', - type: 'action', - id: alertId, - }, - ], - }); - - taskManager.runNow.mockReturnValueOnce(Promise.resolve({ id: alertId })); - } - - test('updating the alert schedule should rerun the task immediately', async () => { - const alertId = uuid.v4(); - const taskId = uuid.v4(); - - mockApiCalls(alertId, taskId, { interval: '60m' }, { interval: '10s' }); - - await alertsClient.update({ - id: alertId, - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - - expect(taskManager.runNow).toHaveBeenCalledWith(taskId); - }); - - test('updating the alert without changing the schedule should not rerun the task', async () => { - const alertId = uuid.v4(); - const taskId = uuid.v4(); - - mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '10s' }); - - await alertsClient.update({ - id: alertId, - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - - expect(taskManager.runNow).not.toHaveBeenCalled(); - }); - - test('updating the alert should not wait for the rerun the task to complete', async () => { - const alertId = uuid.v4(); - const taskId = uuid.v4(); - - mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '30s' }); - - const resolveAfterAlertUpdatedCompletes = resolvable<{ id: string }>(); - - taskManager.runNow.mockReset(); - taskManager.runNow.mockReturnValue(resolveAfterAlertUpdatedCompletes); - - await alertsClient.update({ - id: alertId, - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - - expect(taskManager.runNow).toHaveBeenCalled(); - resolveAfterAlertUpdatedCompletes.resolve({ id: alertId }); - }); - - test('logs when the rerun of an alerts underlying task fails', async () => { - const alertId = uuid.v4(); - const taskId = uuid.v4(); - - mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '30s' }); - - taskManager.runNow.mockReset(); - taskManager.runNow.mockRejectedValue(new Error('Failed to run alert')); - - await alertsClient.update({ - id: alertId, - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [ - { - group: 'default', - id: '1', - params: { - foo: true, - }, - }, - ], - }, - }); - - expect(taskManager.runNow).toHaveBeenCalled(); - - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - `Alert update failed to run its underlying task. TaskManager runNow failed with Error: Failed to run alert` - ); - }); - }); - - describe('authorization', () => { - beforeEach(() => { - unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - schedule: { interval: '10s' }, - params: { - bar: true, - }, - actions: [], - scheduledTaskId: 'task-123', - createdAt: new Date().toISOString(), - }, - updated_at: new Date().toISOString(), - references: [], - }); - }); - - test('ensures user is authorised to update this type of alert under the consumer', async () => { - await alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [], - }, - }); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'update'); - }); - - test('throws when user is not authorised to update this type of alert', async () => { - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to update a "myType" alert for "myApp"`) - ); - - await expect( - alertsClient.update({ - id: '1', - data: { - schedule: { interval: '10s' }, - name: 'abc', - tags: ['foo'], - params: { - bar: true, - }, - throttle: null, - actions: [], - }, - }) - ).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to update a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'update'); - }); - }); -}); - -describe('updateApiKey()', () => { - let alertsClient: AlertsClient; - const existingAlert = { - id: '1', - type: 'alert', - attributes: { - schedule: { interval: '10s' }, - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - }, - version: '123', - references: [], - }; - const existingEncryptedAlert = { - ...existingAlert, - attributes: { - ...existingAlert.attributes, - apiKey: Buffer.from('123:abc').toString('base64'), - }, - }; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); - encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingEncryptedAlert); - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '234', name: '123', api_key: 'abc' }, - }); - }); - - test('updates the API key for the alert', async () => { - await alertsClient.updateApiKey({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - schedule: { interval: '10s' }, - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - apiKey: Buffer.from('234:abc').toString('base64'), - apiKeyOwner: 'elastic', - updatedBy: 'elastic', - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - meta: { - versionApiKeyLastmodified: kibanaVersion, - }, - }, - { version: '123' } - ); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); - }); - - test('falls back to SOC when getDecryptedAsInternalUser throws an error', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); - - await alertsClient.updateApiKey({ id: '1' }); - expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); - expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { - namespace: 'default', - }); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( - 'alert', - '1', - { - schedule: { interval: '10s' }, - alertTypeId: 'myType', - consumer: 'myApp', - enabled: true, - apiKey: Buffer.from('234:abc').toString('base64'), - apiKeyOwner: 'elastic', - updatedBy: 'elastic', - actions: [ - { - group: 'default', - id: '1', - actionTypeId: '1', - actionRef: '1', - params: { - foo: true, - }, - }, - ], - meta: { - versionApiKeyLastmodified: kibanaVersion, - }, - }, - { version: '123' } - ); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - }); - - test('swallows error when invalidate API key throws', async () => { - alertsClientParams.invalidateAPIKey.mockRejectedValue(new Error('Fail')); - - await alertsClient.updateApiKey({ id: '1' }); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'Failed to invalidate API Key: Fail' - ); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); - }); - - test('swallows error when getting decrypted object throws', async () => { - encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); - - await alertsClient.updateApiKey({ id: '1' }); - expect(alertsClientParams.logger.error).toHaveBeenCalledWith( - 'updateApiKey(): Failed to load API key to invalidate on alert 1: Fail' - ); - expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); - }); - - test('throws when unsecuredSavedObjectsClient update fails and invalidates newly created API key', async () => { - alertsClientParams.createAPIKey.mockResolvedValueOnce({ - apiKeysEnabled: true, - result: { id: '234', name: '234', api_key: 'abc' }, - }); - unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Fail')); - - await expect(alertsClient.updateApiKey({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( - `"Fail"` - ); - expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalledWith({ id: '123' }); - expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '234' }); - }); - - describe('authorization', () => { - test('ensures user is authorised to updateApiKey this type of alert under the consumer', async () => { - await alertsClient.updateApiKey({ id: '1' }); - - expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'updateApiKey' - ); - }); - - test('throws when user is not authorised to updateApiKey this type of alert', async () => { - authorization.ensureAuthorized.mockRejectedValue( - new Error(`Unauthorized to updateApiKey a "myType" alert for "myApp"`) - ); - - await expect(alertsClient.updateApiKey({ id: '1' })).rejects.toMatchInlineSnapshot( - `[Error: Unauthorized to updateApiKey a "myType" alert for "myApp"]` - ); - - expect(authorization.ensureAuthorized).toHaveBeenCalledWith( - 'myType', - 'myApp', - 'updateApiKey' - ); - }); - }); -}); - -describe('listAlertTypes', () => { - let alertsClient: AlertsClient; - const alertingAlertType = { - actionGroups: [], - actionVariables: undefined, - defaultActionGroupId: 'default', - id: 'alertingAlertType', - name: 'alertingAlertType', - producer: 'alerts', - }; - const myAppAlertType = { - actionGroups: [], - actionVariables: undefined, - defaultActionGroupId: 'default', - id: 'myAppAlertType', - name: 'myAppAlertType', - producer: 'myApp', - }; - const setOfAlertTypes = new Set([myAppAlertType, alertingAlertType]); - - const authorizedConsumers = { - alerts: { read: true, all: true }, - myApp: { read: true, all: true }, - myOtherApp: { read: true, all: true }, - }; - - beforeEach(() => { - alertsClient = new AlertsClient(alertsClientParams); - }); - - test('should return a list of AlertTypes that exist in the registry', async () => { - alertTypeRegistry.list.mockReturnValue(setOfAlertTypes); - authorization.filterByAlertTypeAuthorization.mockResolvedValue( - new Set([ - { ...myAppAlertType, authorizedConsumers }, - { ...alertingAlertType, authorizedConsumers }, - ]) - ); - expect(await alertsClient.listAlertTypes()).toEqual( - new Set([ - { ...myAppAlertType, authorizedConsumers }, - { ...alertingAlertType, authorizedConsumers }, - ]) - ); - }); - - describe('authorization', () => { - const listedTypes = new Set([ - { - actionGroups: [], - actionVariables: undefined, - defaultActionGroupId: 'default', - id: 'myType', - name: 'myType', - producer: 'myApp', - }, - { - id: 'myOtherType', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - producer: 'alerts', - }, - ]); - beforeEach(() => { - alertTypeRegistry.list.mockReturnValue(listedTypes); - }); - - test('should return a list of AlertTypes that exist in the registry only if the user is authorised to get them', async () => { - const authorizedTypes = new Set([ - { - id: 'myType', - name: 'Test', - actionGroups: [{ id: 'default', name: 'Default' }], - defaultActionGroupId: 'default', - producer: 'alerts', - authorizedConsumers: { - myApp: { read: true, all: true }, - }, - }, - ]); - authorization.filterByAlertTypeAuthorization.mockResolvedValue(authorizedTypes); - - expect(await alertsClient.listAlertTypes()).toEqual(authorizedTypes); - }); - }); -}); diff --git a/x-pack/plugins/alerts/server/alerts_client.ts b/x-pack/plugins/alerts/server/alerts_client/alerts_client.ts similarity index 96% rename from x-pack/plugins/alerts/server/alerts_client.ts rename to x-pack/plugins/alerts/server/alerts_client/alerts_client.ts index bd278d39c6229..ef3a9e42b983f 100644 --- a/x-pack/plugins/alerts/server/alerts_client.ts +++ b/x-pack/plugins/alerts/server/alerts_client/alerts_client.ts @@ -14,8 +14,8 @@ import { SavedObject, PluginInitializerContext, } from 'src/core/server'; -import { esKuery } from '../../../../src/plugins/data/server'; -import { ActionsClient, ActionsAuthorization } from '../../actions/server'; +import { esKuery } from '../../../../../src/plugins/data/server'; +import { ActionsClient, ActionsAuthorization } from '../../../actions/server'; import { Alert, PartialAlert, @@ -27,26 +27,26 @@ import { SanitizedAlert, AlertTaskState, AlertInstanceSummary, -} from './types'; -import { validateAlertTypeParams, alertExecutionStatusFromRaw } from './lib'; +} from '../types'; +import { validateAlertTypeParams, alertExecutionStatusFromRaw } from '../lib'; import { InvalidateAPIKeyParams, GrantAPIKeyResult as SecurityPluginGrantAPIKeyResult, InvalidateAPIKeyResult as SecurityPluginInvalidateAPIKeyResult, -} from '../../security/server'; -import { EncryptedSavedObjectsClient } from '../../encrypted_saved_objects/server'; -import { TaskManagerStartContract } from '../../task_manager/server'; -import { taskInstanceToAlertTaskInstance } from './task_runner/alert_task_instance'; -import { deleteTaskIfItExists } from './lib/delete_task_if_it_exists'; -import { RegistryAlertType } from './alert_type_registry'; -import { AlertsAuthorization, WriteOperations, ReadOperations, and } from './authorization'; -import { IEventLogClient } from '../../../plugins/event_log/server'; -import { parseIsoOrRelativeDate } from './lib/iso_or_relative_date'; -import { alertInstanceSummaryFromEventLog } from './lib/alert_instance_summary_from_event_log'; -import { IEvent } from '../../event_log/server'; -import { parseDuration } from '../common/parse_duration'; -import { retryIfConflicts } from './lib/retry_if_conflicts'; -import { partiallyUpdateAlert } from './saved_objects'; +} from '../../../security/server'; +import { EncryptedSavedObjectsClient } from '../../../encrypted_saved_objects/server'; +import { TaskManagerStartContract } from '../../../task_manager/server'; +import { taskInstanceToAlertTaskInstance } from '../task_runner/alert_task_instance'; +import { deleteTaskIfItExists } from '../lib/delete_task_if_it_exists'; +import { RegistryAlertType } from '../alert_type_registry'; +import { AlertsAuthorization, WriteOperations, ReadOperations, and } from '../authorization'; +import { IEventLogClient } from '../../../../plugins/event_log/server'; +import { parseIsoOrRelativeDate } from '../lib/iso_or_relative_date'; +import { alertInstanceSummaryFromEventLog } from '../lib/alert_instance_summary_from_event_log'; +import { IEvent } from '../../../event_log/server'; +import { parseDuration } from '../../common/parse_duration'; +import { retryIfConflicts } from '../lib/retry_if_conflicts'; +import { partiallyUpdateAlert } from '../saved_objects'; export interface RegistryAlertTypeWithAuth extends RegistryAlertType { authorizedConsumers: string[]; diff --git a/x-pack/plugins/alerts/server/alerts_client/index.ts b/x-pack/plugins/alerts/server/alerts_client/index.ts new file mode 100644 index 0000000000000..e40076a29fffd --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/index.ts @@ -0,0 +1,6 @@ +/* + * 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 './alerts_client'; diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/create.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/create.test.ts new file mode 100644 index 0000000000000..65a30d1750149 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/create.test.ts @@ -0,0 +1,1097 @@ +/* + * 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 { AlertsClient, ConstructorOptions, CreateOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsClientMock, actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { TaskStatus } from '../../../../task_manager/server'; +import { getBeforeSetup, setGlobalDate } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +setGlobalDate(); + +function getMockData(overwrites: Record = {}): CreateOptions['data'] { + return { + enabled: true, + name: 'abc', + tags: ['foo'], + alertTypeId: '123', + consumer: 'bar', + schedule: { interval: '10s' }, + throttle: null, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + ...overwrites, + }; +} + +describe('create()', () => { + let alertsClient: AlertsClient; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + }); + + describe('authorization', () => { + function tryToExecuteOperation(options: CreateOptions): Promise { + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: '2019-02-12T21:01:22.479Z', + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + scheduledTaskId: 'task-123', + }, + references: [ + { + id: '1', + name: 'action_0', + type: 'action', + }, + ], + }); + + return alertsClient.create(options); + } + + test('ensures user is authorised to create this type of alert under the consumer', async () => { + const data = getMockData({ + alertTypeId: 'myType', + consumer: 'myApp', + }); + + await tryToExecuteOperation({ data }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'create'); + }); + + test('throws when user is not authorised to create this type of alert', async () => { + const data = getMockData({ + alertTypeId: 'myType', + consumer: 'myApp', + }); + + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to create a "myType" alert for "myApp"`) + ); + + await expect(tryToExecuteOperation({ data })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to create a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'create'); + }); + }); + + test('creates an alert', async () => { + const data = getMockData(); + const createdAttributes = { + ...data, + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: '2019-02-12T21:01:22.479Z', + createdBy: 'elastic', + updatedBy: 'elastic', + muteAll: false, + mutedInstanceIds: [], + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }; + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: createdAttributes, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + ...createdAttributes, + scheduledTaskId: 'task-123', + }, + references: [ + { + id: '1', + name: 'action_0', + type: 'action', + }, + ], + }); + const result = await alertsClient.create({ data }); + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('123', 'bar', 'create'); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "123", + "consumer": "bar", + "createdAt": 2019-02-12T21:01:22.479Z, + "createdBy": "elastic", + "enabled": true, + "id": "1", + "muteAll": false, + "mutedInstanceIds": Array [], + "name": "abc", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "tags": Array [ + "foo", + ], + "throttle": null, + "updatedAt": 2019-02-12T21:01:22.479Z, + "updatedBy": "elastic", + } + `); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionRef": "action_0", + "actionTypeId": "test", + "group": "default", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "123", + "apiKey": null, + "apiKeyOwner": null, + "consumer": "bar", + "createdAt": "2019-02-12T21:01:22.479Z", + "createdBy": "elastic", + "enabled": true, + "executionStatus": Object { + "error": null, + "lastExecutionDate": "2019-02-12T21:01:22.479Z", + "status": "pending", + }, + "meta": Object { + "versionApiKeyLastmodified": "v7.10.0", + }, + "muteAll": false, + "mutedInstanceIds": Array [], + "name": "abc", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "tags": Array [ + "foo", + ], + "throttle": null, + "updatedBy": "elastic", + } + `); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` + Object { + "references": Array [ + Object { + "id": "1", + "name": "action_0", + "type": "action", + }, + ], + } + `); + expect(taskManager.schedule).toHaveBeenCalledTimes(1); + expect(taskManager.schedule.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "params": Object { + "alertId": "1", + "spaceId": "default", + }, + "scope": Array [ + "alerting", + ], + "state": Object { + "alertInstances": Object {}, + "alertTypeState": Object {}, + "previousStartedAt": null, + }, + "taskType": "alerting:123", + }, + ] + `); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.update.mock.calls[0]).toHaveLength(3); + expect(unsecuredSavedObjectsClient.update.mock.calls[0][0]).toEqual('alert'); + expect(unsecuredSavedObjectsClient.update.mock.calls[0][1]).toEqual('1'); + expect(unsecuredSavedObjectsClient.update.mock.calls[0][2]).toMatchInlineSnapshot(` + Object { + "scheduledTaskId": "task-123", + } + `); + }); + + test('creates an alert with multiple actions', async () => { + const data = getMockData({ + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '2', + params: { + foo: true, + }, + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + { + group: 'default', + actionRef: 'action_1', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + { + group: 'default', + actionRef: 'action_2', + actionTypeId: 'test2', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + { + name: 'action_1', + type: 'action', + id: '1', + }, + { + name: 'action_2', + type: 'action', + id: '2', + }, + ], + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + scheduledTaskId: 'task-123', + }, + references: [], + }); + const result = await alertsClient.create({ data }); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + Object { + "actionTypeId": "test2", + "group": "default", + "id": "2", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "123", + "createdAt": 2019-02-12T21:01:22.479Z, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "updatedAt": 2019-02-12T21:01:22.479Z, + } + `); + }); + + test('creates a disabled alert', async () => { + const data = getMockData({ enabled: false }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: false, + alertTypeId: '123', + schedule: { interval: 10000 }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + const result = await alertsClient.create({ data }); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "123", + "createdAt": 2019-02-12T21:01:22.479Z, + "enabled": false, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": 10000, + }, + "updatedAt": 2019-02-12T21:01:22.479Z, + } + `); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); + expect(taskManager.schedule).toHaveBeenCalledTimes(0); + }); + + test('should trim alert name when creating API key', async () => { + const data = getMockData({ name: ' my alert name ' }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: false, + name: ' my alert name ', + alertTypeId: '123', + schedule: { interval: 10000 }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + + await alertsClient.create({ data }); + expect(alertsClientParams.createAPIKey).toHaveBeenCalledWith('Alerting: 123/my alert name'); + }); + + test('should validate params', async () => { + const data = getMockData(); + alertTypeRegistry.get.mockReturnValue({ + id: '123', + name: 'Test', + actionGroups: [ + { + id: 'default', + name: 'Default', + }, + ], + defaultActionGroupId: 'default', + validate: { + params: schema.object({ + param1: schema.string(), + threshold: schema.number({ min: 0, max: 1 }), + }), + }, + async executor() {}, + producer: 'alerts', + }); + await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( + `"params invalid: [param1]: expected value of type [string] but got [undefined]"` + ); + }); + + test('throws error if loading actions fails', async () => { + const data = getMockData(); + const actionsClient = actionsClientMock.create(); + actionsClient.getBulk.mockRejectedValueOnce(new Error('Test Error')); + alertsClientParams.getActionsClient.mockResolvedValue(actionsClient); + await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Test Error"` + ); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + expect(taskManager.schedule).not.toHaveBeenCalled(); + }); + + test('throws error and invalidates API key when create saved object fails', async () => { + const data = getMockData(); + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockRejectedValueOnce(new Error('Test failure')); + await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Test failure"` + ); + expect(taskManager.schedule).not.toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + }); + + test('attempts to remove saved object if scheduling failed', async () => { + const data = getMockData(); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockRejectedValueOnce(new Error('Test failure')); + unsecuredSavedObjectsClient.delete.mockResolvedValueOnce({}); + await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Test failure"` + ); + expect(unsecuredSavedObjectsClient.delete).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.delete.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "alert", + "1", + ] + `); + }); + + test('returns task manager error if cleanup fails, logs to console', async () => { + const data = getMockData(); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockRejectedValueOnce(new Error('Task manager error')); + unsecuredSavedObjectsClient.delete.mockRejectedValueOnce( + new Error('Saved object delete error') + ); + await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Task manager error"` + ); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'Failed to cleanup alert "1" after scheduling task failed. Error: Saved object delete error' + ); + }); + + test('throws an error if alert type not registerd', async () => { + const data = getMockData(); + alertTypeRegistry.get.mockImplementation(() => { + throw new Error('Invalid type'); + }); + await expect(alertsClient.create({ data })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Invalid type"` + ); + }); + + test('calls the API key function', async () => { + const data = getMockData(); + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + scheduledTaskId: 'task-123', + }, + references: [ + { + id: '1', + name: 'action_0', + type: 'action', + }, + ], + }); + await alertsClient.create({ data }); + + expect(alertsClientParams.createAPIKey).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledWith( + 'alert', + { + actions: [ + { + actionRef: 'action_0', + group: 'default', + actionTypeId: 'test', + params: { foo: true }, + }, + ], + alertTypeId: '123', + consumer: 'bar', + name: 'abc', + params: { bar: true }, + apiKey: Buffer.from('123:abc').toString('base64'), + apiKeyOwner: 'elastic', + createdBy: 'elastic', + createdAt: '2019-02-12T21:01:22.479Z', + updatedBy: 'elastic', + enabled: true, + meta: { + versionApiKeyLastmodified: 'v7.10.0', + }, + schedule: { interval: '10s' }, + throttle: null, + muteAll: false, + mutedInstanceIds: [], + tags: ['foo'], + executionStatus: { + lastExecutionDate: '2019-02-12T21:01:22.479Z', + status: 'pending', + error: null, + }, + }, + { + references: [ + { + id: '1', + name: 'action_0', + type: 'action', + }, + ], + } + ); + }); + + test(`doesn't create API key for disabled alerts`, async () => { + const data = getMockData({ enabled: false }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + taskManager.schedule.mockResolvedValueOnce({ + id: 'task-123', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + scheduledTaskId: 'task-123', + }, + references: [ + { + id: '1', + name: 'action_0', + type: 'action', + }, + ], + }); + await alertsClient.create({ data }); + + expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledWith( + 'alert', + { + actions: [ + { + actionRef: 'action_0', + group: 'default', + actionTypeId: 'test', + params: { foo: true }, + }, + ], + alertTypeId: '123', + consumer: 'bar', + name: 'abc', + params: { bar: true }, + apiKey: null, + apiKeyOwner: null, + createdBy: 'elastic', + createdAt: '2019-02-12T21:01:22.479Z', + updatedBy: 'elastic', + enabled: false, + meta: { + versionApiKeyLastmodified: 'v7.10.0', + }, + schedule: { interval: '10s' }, + throttle: null, + muteAll: false, + mutedInstanceIds: [], + tags: ['foo'], + executionStatus: { + lastExecutionDate: '2019-02-12T21:01:22.479Z', + status: 'pending', + error: null, + }, + }, + { + references: [ + { + id: '1', + name: 'action_0', + type: 'action', + }, + ], + } + ); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/delete.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/delete.test.ts new file mode 100644 index 0000000000000..1ebd9fc296b13 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/delete.test.ts @@ -0,0 +1,204 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('delete()', () => { + let alertsClient: AlertsClient; + const existingAlert = { + id: '1', + type: 'alert', + attributes: { + alertTypeId: 'myType', + consumer: 'myApp', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + scheduledTaskId: 'task-123', + actions: [ + { + group: 'default', + actionTypeId: '.no-op', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }; + const existingDecryptedAlert = { + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: Buffer.from('123:abc').toString('base64'), + }, + }; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); + unsecuredSavedObjectsClient.delete.mockResolvedValue({ + success: true, + }); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); + }); + + test('successfully removes an alert', async () => { + const result = await alertsClient.delete({ id: '1' }); + expect(result).toEqual({ success: true }); + expect(unsecuredSavedObjectsClient.delete).toHaveBeenCalledWith('alert', '1'); + expect(taskManager.remove).toHaveBeenCalledWith('task-123'); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + }); + + test('falls back to SOC.get when getDecryptedAsInternalUser throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + + const result = await alertsClient.delete({ id: '1' }); + expect(result).toEqual({ success: true }); + expect(unsecuredSavedObjectsClient.delete).toHaveBeenCalledWith('alert', '1'); + expect(taskManager.remove).toHaveBeenCalledWith('task-123'); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'delete(): Failed to load API key to invalidate on alert 1: Fail' + ); + }); + + test(`doesn't remove a task when scheduledTaskId is null`, async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ + ...existingDecryptedAlert, + attributes: { + ...existingDecryptedAlert.attributes, + scheduledTaskId: null, + }, + }); + + await alertsClient.delete({ id: '1' }); + expect(taskManager.remove).not.toHaveBeenCalled(); + }); + + test(`doesn't invalidate API key when apiKey is null`, async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: null, + }, + }); + + await alertsClient.delete({ id: '1' }); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + }); + + test('swallows error when invalidate API key throws', async () => { + alertsClientParams.invalidateAPIKey.mockRejectedValueOnce(new Error('Fail')); + + await alertsClient.delete({ id: '1' }); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'Failed to invalidate API Key: Fail' + ); + }); + + test('swallows error when getDecryptedAsInternalUser throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + + await alertsClient.delete({ id: '1' }); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'delete(): Failed to load API key to invalidate on alert 1: Fail' + ); + }); + + test('throws error when unsecuredSavedObjectsClient.get throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + unsecuredSavedObjectsClient.get.mockRejectedValue(new Error('SOC Fail')); + + await expect(alertsClient.delete({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"SOC Fail"` + ); + }); + + test('throws error when taskManager.remove throws an error', async () => { + taskManager.remove.mockRejectedValue(new Error('TM Fail')); + + await expect(alertsClient.delete({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"TM Fail"` + ); + }); + + describe('authorization', () => { + test('ensures user is authorised to delete this type of alert under the consumer', async () => { + await alertsClient.delete({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'delete'); + }); + + test('throws when user is not authorised to delete this type of alert', async () => { + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to delete a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.delete({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to delete a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'delete'); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/disable.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/disable.test.ts new file mode 100644 index 0000000000000..2dd3da07234ce --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/disable.test.ts @@ -0,0 +1,253 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('disable()', () => { + let alertsClient: AlertsClient; + const existingAlert = { + id: '1', + type: 'alert', + attributes: { + consumer: 'myApp', + schedule: { interval: '10s' }, + alertTypeId: 'myType', + enabled: true, + scheduledTaskId: 'task-123', + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + version: '123', + references: [], + }; + const existingDecryptedAlert = { + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: Buffer.from('123:abc').toString('base64'), + }, + version: '123', + references: [], + }; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); + }); + + describe('authorization', () => { + test('ensures user is authorised to disable this type of alert under the consumer', async () => { + await alertsClient.disable({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'disable'); + }); + + test('throws when user is not authorised to disable this type of alert', async () => { + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to disable a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.disable({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to disable a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'disable'); + }); + }); + + test('disables an alert', async () => { + await alertsClient.disable({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + consumer: 'myApp', + schedule: { interval: '10s' }, + alertTypeId: 'myType', + enabled: false, + meta: { + versionApiKeyLastmodified: kibanaVersion, + }, + scheduledTaskId: null, + apiKey: null, + apiKeyOwner: null, + updatedBy: 'elastic', + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + { + version: '123', + } + ); + expect(taskManager.remove).toHaveBeenCalledWith('task-123'); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + }); + + test('falls back when getDecryptedAsInternalUser throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); + + await alertsClient.disable({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + consumer: 'myApp', + schedule: { interval: '10s' }, + alertTypeId: 'myType', + enabled: false, + meta: { + versionApiKeyLastmodified: kibanaVersion, + }, + scheduledTaskId: null, + apiKey: null, + apiKeyOwner: null, + updatedBy: 'elastic', + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + { + version: '123', + } + ); + expect(taskManager.remove).toHaveBeenCalledWith('task-123'); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + }); + + test(`doesn't disable already disabled alerts`, async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ + ...existingDecryptedAlert, + attributes: { + ...existingDecryptedAlert.attributes, + actions: [], + enabled: false, + }, + }); + + await alertsClient.disable({ id: '1' }); + expect(unsecuredSavedObjectsClient.update).not.toHaveBeenCalled(); + expect(taskManager.remove).not.toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + }); + + test(`doesn't invalidate when no API key is used`, async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce(existingAlert); + + await alertsClient.disable({ id: '1' }); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + }); + + test('swallows error when failing to load decrypted saved object', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); + + await alertsClient.disable({ id: '1' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); + expect(taskManager.remove).toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'disable(): Failed to load API key to invalidate on alert 1: Fail' + ); + }); + + test('throws when unsecuredSavedObjectsClient update fails', async () => { + unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Failed to update')); + + await expect(alertsClient.disable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Failed to update"` + ); + }); + + test('swallows error when invalidate API key throws', async () => { + alertsClientParams.invalidateAPIKey.mockRejectedValueOnce(new Error('Fail')); + + await alertsClient.disable({ id: '1' }); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'Failed to invalidate API Key: Fail' + ); + }); + + test('throws when failing to remove task from task manager', async () => { + taskManager.remove.mockRejectedValueOnce(new Error('Failed to remove task')); + + await expect(alertsClient.disable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Failed to remove task"` + ); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/enable.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/enable.test.ts new file mode 100644 index 0000000000000..b214d8ba697b1 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/enable.test.ts @@ -0,0 +1,361 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { TaskStatus } from '../../../../task_manager/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('enable()', () => { + let alertsClient: AlertsClient; + const existingAlert = { + id: '1', + type: 'alert', + attributes: { + consumer: 'myApp', + schedule: { interval: '10s' }, + alertTypeId: 'myType', + enabled: false, + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + version: '123', + references: [], + }; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingAlert); + unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); + alertsClientParams.createAPIKey.mockResolvedValue({ + apiKeysEnabled: false, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + ...existingAlert, + attributes: { + ...existingAlert.attributes, + enabled: true, + apiKey: null, + apiKeyOwner: null, + updatedBy: 'elastic', + }, + }); + taskManager.schedule.mockResolvedValue({ + id: 'task-123', + scheduledAt: new Date(), + attempts: 0, + status: TaskStatus.Idle, + runAt: new Date(), + state: {}, + params: {}, + taskType: '', + startedAt: null, + retryAt: null, + ownerId: null, + }); + }); + + describe('authorization', () => { + beforeEach(() => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingAlert); + unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); + alertsClientParams.createAPIKey.mockResolvedValue({ + apiKeysEnabled: false, + }); + taskManager.schedule.mockResolvedValue({ + id: 'task-123', + scheduledAt: new Date(), + attempts: 0, + status: TaskStatus.Idle, + runAt: new Date(), + state: {}, + params: {}, + taskType: '', + startedAt: null, + retryAt: null, + ownerId: null, + }); + }); + + test('ensures user is authorised to enable this type of alert under the consumer', async () => { + await alertsClient.enable({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'enable'); + expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); + }); + + test('throws when user is not authorised to enable this type of alert', async () => { + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to enable a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.enable({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to enable a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'enable'); + }); + }); + + test('enables an alert', async () => { + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + ...existingAlert, + attributes: { + ...existingAlert.attributes, + enabled: true, + apiKey: null, + apiKeyOwner: null, + updatedBy: 'elastic', + }, + }); + + await alertsClient.enable({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + schedule: { interval: '10s' }, + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + meta: { + versionApiKeyLastmodified: kibanaVersion, + }, + updatedBy: 'elastic', + apiKey: null, + apiKeyOwner: null, + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + { + version: '123', + } + ); + expect(taskManager.schedule).toHaveBeenCalledWith({ + taskType: `alerting:myType`, + params: { + alertId: '1', + spaceId: 'default', + }, + state: { + alertInstances: {}, + alertTypeState: {}, + previousStartedAt: null, + }, + scope: ['alerting'], + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith('alert', '1', { + scheduledTaskId: 'task-123', + }); + }); + + test('invalidates API key if ever one existed prior to updating', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: Buffer.from('123:abc').toString('base64'), + }, + }); + + await alertsClient.enable({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + }); + + test(`doesn't enable already enabled alerts`, async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ + ...existingAlert, + attributes: { + ...existingAlert.attributes, + enabled: true, + }, + }); + + await alertsClient.enable({ id: '1' }); + expect(alertsClientParams.getUserName).not.toHaveBeenCalled(); + expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + expect(taskManager.schedule).not.toHaveBeenCalled(); + }); + + test('sets API key when createAPIKey returns one', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); + + await alertsClient.enable({ id: '1' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + schedule: { interval: '10s' }, + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + meta: { + versionApiKeyLastmodified: kibanaVersion, + }, + apiKey: Buffer.from('123:abc').toString('base64'), + apiKeyOwner: 'elastic', + updatedBy: 'elastic', + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + { + version: '123', + } + ); + }); + + test('falls back when failing to getDecryptedAsInternalUser', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + + await alertsClient.enable({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'enable(): Failed to load API key to invalidate on alert 1: Fail' + ); + }); + + test('throws error when failing to load the saved object using SOC', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + unsecuredSavedObjectsClient.get.mockRejectedValueOnce(new Error('Fail to get')); + + await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Fail to get"` + ); + expect(alertsClientParams.getUserName).not.toHaveBeenCalled(); + expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.update).not.toHaveBeenCalled(); + expect(taskManager.schedule).not.toHaveBeenCalled(); + }); + + test('throws error when failing to update the first time', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.update.mockReset(); + unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Fail to update')); + + await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Fail to update"` + ); + expect(alertsClientParams.getUserName).toHaveBeenCalled(); + expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(1); + expect(taskManager.schedule).not.toHaveBeenCalled(); + }); + + test('throws error when failing to update the second time', async () => { + unsecuredSavedObjectsClient.update.mockReset(); + unsecuredSavedObjectsClient.update.mockResolvedValueOnce({ + ...existingAlert, + attributes: { + ...existingAlert.attributes, + enabled: true, + }, + }); + unsecuredSavedObjectsClient.update.mockRejectedValueOnce( + new Error('Fail to update second time') + ); + + await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Fail to update second time"` + ); + expect(alertsClientParams.getUserName).toHaveBeenCalled(); + expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledTimes(2); + expect(taskManager.schedule).toHaveBeenCalled(); + }); + + test('throws error when failing to schedule task', async () => { + taskManager.schedule.mockRejectedValueOnce(new Error('Fail to schedule')); + + await expect(alertsClient.enable({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Fail to schedule"` + ); + expect(alertsClientParams.getUserName).toHaveBeenCalled(); + expect(alertsClientParams.createAPIKey).toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/find.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/find.test.ts new file mode 100644 index 0000000000000..bf55a2070d8fe --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/find.test.ts @@ -0,0 +1,251 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { nodeTypes } from '../../../../../../src/plugins/data/common'; +import { esKuery } from '../../../../../../src/plugins/data/server'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup, setGlobalDate } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +setGlobalDate(); + +describe('find()', () => { + const listedTypes = new Set([ + { + actionGroups: [], + actionVariables: undefined, + defaultActionGroupId: 'default', + id: 'myType', + name: 'myType', + producer: 'myApp', + }, + ]); + beforeEach(() => { + authorization.getFindAuthorizationFilter.mockResolvedValue({ + ensureAlertTypeIsAuthorized() {}, + logSuccessfulAuthorization() {}, + }); + unsecuredSavedObjectsClient.find.mockResolvedValueOnce({ + total: 1, + per_page: 10, + page: 1, + saved_objects: [ + { + id: '1', + type: 'alert', + attributes: { + alertTypeId: 'myType', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + score: 1, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }, + ], + }); + alertTypeRegistry.list.mockReturnValue(listedTypes); + authorization.filterByAlertTypeAuthorization.mockResolvedValue( + new Set([ + { + id: 'myType', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + producer: 'alerts', + authorizedConsumers: { + myApp: { read: true, all: true }, + }, + }, + ]) + ); + }); + + test('calls saved objects client with given params', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + const result = await alertsClient.find({ options: {} }); + expect(result).toMatchInlineSnapshot(` + Object { + "data": Array [ + Object { + "actions": Array [ + Object { + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "myType", + "createdAt": 2019-02-12T21:01:22.479Z, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "updatedAt": 2019-02-12T21:01:22.479Z, + }, + ], + "page": 1, + "perPage": 10, + "total": 1, + } + `); + expect(unsecuredSavedObjectsClient.find).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.find.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "fields": undefined, + "filter": undefined, + "type": "alert", + }, + ] + `); + }); + + describe('authorization', () => { + test('ensures user is query filter types down to those the user is authorized to find', async () => { + const filter = esKuery.fromKueryExpression( + '((alert.attributes.alertTypeId:myType and alert.attributes.consumer:myApp) or (alert.attributes.alertTypeId:myOtherType and alert.attributes.consumer:myApp) or (alert.attributes.alertTypeId:myOtherType and alert.attributes.consumer:myOtherApp))' + ); + authorization.getFindAuthorizationFilter.mockResolvedValue({ + filter, + ensureAlertTypeIsAuthorized() {}, + logSuccessfulAuthorization() {}, + }); + + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.find({ options: { filter: 'someTerm' } }); + + const [options] = unsecuredSavedObjectsClient.find.mock.calls[0]; + expect(options.filter).toEqual( + nodeTypes.function.buildNode('and', [esKuery.fromKueryExpression('someTerm'), filter]) + ); + expect(authorization.getFindAuthorizationFilter).toHaveBeenCalledTimes(1); + }); + + test('throws if user is not authorized to find any types', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + authorization.getFindAuthorizationFilter.mockRejectedValue(new Error('not authorized')); + await expect(alertsClient.find({ options: {} })).rejects.toThrowErrorMatchingInlineSnapshot( + `"not authorized"` + ); + }); + + test('ensures authorization even when the fields required to authorize are omitted from the find', async () => { + const ensureAlertTypeIsAuthorized = jest.fn(); + const logSuccessfulAuthorization = jest.fn(); + authorization.getFindAuthorizationFilter.mockResolvedValue({ + ensureAlertTypeIsAuthorized, + logSuccessfulAuthorization, + }); + + unsecuredSavedObjectsClient.find.mockReset(); + unsecuredSavedObjectsClient.find.mockResolvedValue({ + total: 1, + per_page: 10, + page: 1, + saved_objects: [ + { + id: '1', + type: 'alert', + attributes: { + actions: [], + alertTypeId: 'myType', + consumer: 'myApp', + tags: ['myTag'], + }, + score: 1, + references: [], + }, + ], + }); + + const alertsClient = new AlertsClient(alertsClientParams); + expect(await alertsClient.find({ options: { fields: ['tags'] } })).toMatchInlineSnapshot(` + Object { + "data": Array [ + Object { + "actions": Array [], + "id": "1", + "schedule": undefined, + "tags": Array [ + "myTag", + ], + }, + ], + "page": 1, + "perPage": 10, + "total": 1, + } + `); + + expect(unsecuredSavedObjectsClient.find).toHaveBeenCalledWith({ + fields: ['tags', 'alertTypeId', 'consumer'], + type: 'alert', + }); + expect(ensureAlertTypeIsAuthorized).toHaveBeenCalledWith('myType', 'myApp'); + expect(logSuccessfulAuthorization).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/get.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/get.test.ts new file mode 100644 index 0000000000000..327a1fa23ef05 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/get.test.ts @@ -0,0 +1,194 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup, setGlobalDate } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +setGlobalDate(); + +describe('get()', () => { + test('calls saved objects client with given params', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + const result = await alertsClient.get({ id: '1' }); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "123", + "createdAt": 2019-02-12T21:01:22.479Z, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "updatedAt": 2019-02-12T21:01:22.479Z, + } + `); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.get.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "alert", + "1", + ] + `); + }); + + test(`throws an error when references aren't found`, async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + references: [], + }); + await expect(alertsClient.get({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Action reference \\"action_0\\" not found in alert id: 1"` + ); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: 'myType', + consumer: 'myApp', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + }); + + test('ensures user is authorised to get this type of alert under the consumer', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.get({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'get'); + }); + + test('throws when user is not authorised to get this type of alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to get a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.get({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to get a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'get'); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/get_alert_instance_summary.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/get_alert_instance_summary.test.ts new file mode 100644 index 0000000000000..09212732b76e7 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/get_alert_instance_summary.test.ts @@ -0,0 +1,292 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { eventLogClientMock } from '../../../../event_log/server/mocks'; +import { QueryEventsBySavedObjectResult } from '../../../../event_log/server'; +import { SavedObject } from 'kibana/server'; +import { EventsFactory } from '../../lib/alert_instance_summary_from_event_log.test'; +import { RawAlert } from '../../types'; +import { getBeforeSetup, mockedDateString, setGlobalDate } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const eventLogClient = eventLogClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry, eventLogClient); +}); + +setGlobalDate(); + +const AlertInstanceSummaryFindEventsResult: QueryEventsBySavedObjectResult = { + page: 1, + per_page: 10000, + total: 0, + data: [], +}; + +const AlertInstanceSummaryIntervalSeconds = 1; + +const BaseAlertInstanceSummarySavedObject: SavedObject = { + id: '1', + type: 'alert', + attributes: { + enabled: true, + name: 'alert-name', + tags: ['tag-1', 'tag-2'], + alertTypeId: '123', + consumer: 'alert-consumer', + schedule: { interval: `${AlertInstanceSummaryIntervalSeconds}s` }, + actions: [], + params: {}, + createdBy: null, + updatedBy: null, + createdAt: mockedDateString, + apiKey: null, + apiKeyOwner: null, + throttle: null, + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'unknown', + lastExecutionDate: '2020-08-20T19:23:38Z', + error: null, + }, + }, + references: [], +}; + +function getAlertInstanceSummarySavedObject( + attributes: Partial = {} +): SavedObject { + return { + ...BaseAlertInstanceSummarySavedObject, + attributes: { ...BaseAlertInstanceSummarySavedObject.attributes, ...attributes }, + }; +} + +describe('getAlertInstanceSummary()', () => { + let alertsClient: AlertsClient; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + }); + + test('runs as expected with some event log data', async () => { + const alertSO = getAlertInstanceSummarySavedObject({ + mutedInstanceIds: ['instance-muted-no-activity'], + }); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(alertSO); + + const eventsFactory = new EventsFactory(mockedDateString); + const events = eventsFactory + .addExecute() + .addNewInstance('instance-currently-active') + .addNewInstance('instance-previously-active') + .addActiveInstance('instance-currently-active') + .addActiveInstance('instance-previously-active') + .advanceTime(10000) + .addExecute() + .addResolvedInstance('instance-previously-active') + .addActiveInstance('instance-currently-active') + .getEvents(); + const eventsResult = { + ...AlertInstanceSummaryFindEventsResult, + total: events.length, + data: events, + }; + eventLogClient.findEventsBySavedObject.mockResolvedValueOnce(eventsResult); + + const dateStart = new Date(Date.now() - 60 * 1000).toISOString(); + + const result = await alertsClient.getAlertInstanceSummary({ id: '1', dateStart }); + expect(result).toMatchInlineSnapshot(` + Object { + "alertTypeId": "123", + "consumer": "alert-consumer", + "enabled": true, + "errorMessages": Array [], + "id": "1", + "instances": Object { + "instance-currently-active": Object { + "activeStartDate": "2019-02-12T21:01:22.479Z", + "muted": false, + "status": "Active", + }, + "instance-muted-no-activity": Object { + "activeStartDate": undefined, + "muted": true, + "status": "OK", + }, + "instance-previously-active": Object { + "activeStartDate": undefined, + "muted": false, + "status": "OK", + }, + }, + "lastRun": "2019-02-12T21:01:32.479Z", + "muteAll": false, + "name": "alert-name", + "status": "Active", + "statusEndDate": "2019-02-12T21:01:22.479Z", + "statusStartDate": "2019-02-12T21:00:22.479Z", + "tags": Array [ + "tag-1", + "tag-2", + ], + "throttle": null, + } + `); + }); + + // Further tests don't check the result of `getAlertInstanceSummary()`, as the result + // is just the result from the `alertInstanceSummaryFromEventLog()`, which itself + // has a complete set of tests. These tests just make sure the data gets + // sent into `getAlertInstanceSummary()` as appropriate. + + test('calls saved objects and event log client with default params', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); + eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( + AlertInstanceSummaryFindEventsResult + ); + + await alertsClient.getAlertInstanceSummary({ id: '1' }); + + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObject).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObject.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "alert", + "1", + Object { + "end": "2019-02-12T21:01:22.479Z", + "page": 1, + "per_page": 10000, + "sort_order": "desc", + "start": "2019-02-12T21:00:22.479Z", + }, + ] + `); + // calculate the expected start/end date for one test + const { start, end } = eventLogClient.findEventsBySavedObject.mock.calls[0][2]!; + expect(end).toBe(mockedDateString); + + const startMillis = Date.parse(start!); + const endMillis = Date.parse(end!); + const expectedDuration = 60 * AlertInstanceSummaryIntervalSeconds * 1000; + expect(endMillis - startMillis).toBeGreaterThan(expectedDuration - 2); + expect(endMillis - startMillis).toBeLessThan(expectedDuration + 2); + }); + + test('calls event log client with start date', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); + eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( + AlertInstanceSummaryFindEventsResult + ); + + const dateStart = new Date( + Date.now() - 60 * AlertInstanceSummaryIntervalSeconds * 1000 + ).toISOString(); + await alertsClient.getAlertInstanceSummary({ id: '1', dateStart }); + + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObject).toHaveBeenCalledTimes(1); + const { start, end } = eventLogClient.findEventsBySavedObject.mock.calls[0][2]!; + + expect({ start, end }).toMatchInlineSnapshot(` + Object { + "end": "2019-02-12T21:01:22.479Z", + "start": "2019-02-12T21:00:22.479Z", + } + `); + }); + + test('calls event log client with relative start date', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); + eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( + AlertInstanceSummaryFindEventsResult + ); + + const dateStart = '2m'; + await alertsClient.getAlertInstanceSummary({ id: '1', dateStart }); + + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObject).toHaveBeenCalledTimes(1); + const { start, end } = eventLogClient.findEventsBySavedObject.mock.calls[0][2]!; + + expect({ start, end }).toMatchInlineSnapshot(` + Object { + "end": "2019-02-12T21:01:22.479Z", + "start": "2019-02-12T20:59:22.479Z", + } + `); + }); + + test('invalid start date throws an error', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); + eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( + AlertInstanceSummaryFindEventsResult + ); + + const dateStart = 'ain"t no way this will get parsed as a date'; + expect( + alertsClient.getAlertInstanceSummary({ id: '1', dateStart }) + ).rejects.toMatchInlineSnapshot( + `[Error: Invalid date for parameter dateStart: "ain"t no way this will get parsed as a date"]` + ); + }); + + test('saved object get throws an error', async () => { + unsecuredSavedObjectsClient.get.mockRejectedValueOnce(new Error('OMG!')); + eventLogClient.findEventsBySavedObject.mockResolvedValueOnce( + AlertInstanceSummaryFindEventsResult + ); + + expect(alertsClient.getAlertInstanceSummary({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: OMG!]` + ); + }); + + test('findEvents throws an error', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getAlertInstanceSummarySavedObject()); + eventLogClient.findEventsBySavedObject.mockRejectedValueOnce(new Error('OMG 2!')); + + // error eaten but logged + await alertsClient.getAlertInstanceSummary({ id: '1' }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/get_alert_state.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/get_alert_state.test.ts new file mode 100644 index 0000000000000..42e573aea347f --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/get_alert_state.test.ts @@ -0,0 +1,239 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { TaskStatus } from '../../../../task_manager/server'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('getAlertState()', () => { + test('calls saved objects client with given params', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + + taskManager.get.mockResolvedValueOnce({ + id: '1', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + + await alertsClient.getAlertState({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.get.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "alert", + "1", + ] + `); + }); + + test('gets the underlying task from TaskManager', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + + const scheduledTaskId = 'task-123'; + + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: '123', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + enabled: true, + scheduledTaskId, + mutedInstanceIds: [], + muteAll: true, + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + + taskManager.get.mockResolvedValueOnce({ + id: scheduledTaskId, + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: { + alertId: '1', + }, + ownerId: null, + }); + + await alertsClient.getAlertState({ id: '1' }); + expect(taskManager.get).toHaveBeenCalledTimes(1); + expect(taskManager.get).toHaveBeenCalledWith(scheduledTaskId); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: 'myType', + consumer: 'myApp', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + params: { + foo: true, + }, + }, + ], + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + + taskManager.get.mockResolvedValueOnce({ + id: '1', + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + }); + + test('ensures user is authorised to get this type of alert under the consumer', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.getAlertState({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'getAlertState' + ); + }); + + test('throws when user is not authorised to getAlertState this type of alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + // `get` check + authorization.ensureAuthorized.mockResolvedValueOnce(); + // `getAlertState` check + authorization.ensureAuthorized.mockRejectedValueOnce( + new Error(`Unauthorized to getAlertState a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.getAlertState({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to getAlertState a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'getAlertState' + ); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/lib.ts b/x-pack/plugins/alerts/server/alerts_client/tests/lib.ts new file mode 100644 index 0000000000000..96e49e21b9045 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/lib.ts @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { TaskManager } from '../../../../task_manager/server/task_manager'; +import { IEventLogClient } from '../../../../event_log/server'; +import { actionsClientMock } from '../../../../actions/server/mocks'; +import { ConstructorOptions } from '../alerts_client'; +import { eventLogClientMock } from '../../../../event_log/server/mocks'; +import { AlertTypeRegistry } from '../../alert_type_registry'; + +export const mockedDateString = '2019-02-12T21:01:22.479Z'; + +export function setGlobalDate() { + const mockedDate = new Date(mockedDateString); + const DateOriginal = Date; + // A version of date that responds to `new Date(null|undefined)` and `Date.now()` + // by returning a fixed date, otherwise should be same as Date. + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + (global as any).Date = class Date { + constructor(...args: unknown[]) { + // sometimes the ctor has no args, sometimes has a single `null` arg + if (args[0] == null) { + // @ts-ignore + return mockedDate; + } else { + // @ts-ignore + return new DateOriginal(...args); + } + } + static now() { + return mockedDate.getTime(); + } + static parse(string: string) { + return DateOriginal.parse(string); + } + }; +} + +export function getBeforeSetup( + alertsClientParams: jest.Mocked, + taskManager: jest.Mocked< + Pick + >, + alertTypeRegistry: jest.Mocked>, + eventLogClient?: jest.Mocked +) { + jest.resetAllMocks(); + alertsClientParams.createAPIKey.mockResolvedValue({ apiKeysEnabled: false }); + alertsClientParams.invalidateAPIKey.mockResolvedValue({ + apiKeysEnabled: true, + result: { + invalidated_api_keys: [], + previously_invalidated_api_keys: [], + error_count: 0, + }, + }); + alertsClientParams.getUserName.mockResolvedValue('elastic'); + taskManager.runNow.mockResolvedValue({ id: '' }); + const actionsClient = actionsClientMock.create(); + + actionsClient.getBulk.mockResolvedValueOnce([ + { + id: '1', + isPreconfigured: false, + actionTypeId: 'test', + name: 'test', + config: { + foo: 'bar', + }, + }, + { + id: '2', + isPreconfigured: false, + actionTypeId: 'test2', + name: 'test2', + config: { + foo: 'bar', + }, + }, + { + id: 'testPreconfigured', + actionTypeId: '.slack', + isPreconfigured: true, + name: 'test', + }, + ]); + alertsClientParams.getActionsClient.mockResolvedValue(actionsClient); + + alertTypeRegistry.get.mockImplementation(() => ({ + id: '123', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + async executor() {}, + producer: 'alerts', + })); + alertsClientParams.getEventLogClient.mockResolvedValue( + eventLogClient ?? eventLogClientMock.create() + ); +} diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/list_alert_types.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/list_alert_types.test.ts new file mode 100644 index 0000000000000..4337ed6c491d4 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/list_alert_types.test.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('listAlertTypes', () => { + let alertsClient: AlertsClient; + const alertingAlertType = { + actionGroups: [], + actionVariables: undefined, + defaultActionGroupId: 'default', + id: 'alertingAlertType', + name: 'alertingAlertType', + producer: 'alerts', + }; + const myAppAlertType = { + actionGroups: [], + actionVariables: undefined, + defaultActionGroupId: 'default', + id: 'myAppAlertType', + name: 'myAppAlertType', + producer: 'myApp', + }; + const setOfAlertTypes = new Set([myAppAlertType, alertingAlertType]); + + const authorizedConsumers = { + alerts: { read: true, all: true }, + myApp: { read: true, all: true }, + myOtherApp: { read: true, all: true }, + }; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + }); + + test('should return a list of AlertTypes that exist in the registry', async () => { + alertTypeRegistry.list.mockReturnValue(setOfAlertTypes); + authorization.filterByAlertTypeAuthorization.mockResolvedValue( + new Set([ + { ...myAppAlertType, authorizedConsumers }, + { ...alertingAlertType, authorizedConsumers }, + ]) + ); + expect(await alertsClient.listAlertTypes()).toEqual( + new Set([ + { ...myAppAlertType, authorizedConsumers }, + { ...alertingAlertType, authorizedConsumers }, + ]) + ); + }); + + describe('authorization', () => { + const listedTypes = new Set([ + { + actionGroups: [], + actionVariables: undefined, + defaultActionGroupId: 'default', + id: 'myType', + name: 'myType', + producer: 'myApp', + }, + { + id: 'myOtherType', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + producer: 'alerts', + }, + ]); + beforeEach(() => { + alertTypeRegistry.list.mockReturnValue(listedTypes); + }); + + test('should return a list of AlertTypes that exist in the registry only if the user is authorised to get them', async () => { + const authorizedTypes = new Set([ + { + id: 'myType', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + producer: 'alerts', + authorizedConsumers: { + myApp: { read: true, all: true }, + }, + }, + ]); + authorization.filterByAlertTypeAuthorization.mockResolvedValue(authorizedTypes); + + expect(await alertsClient.listAlertTypes()).toEqual(authorizedTypes); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/mute_all.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/mute_all.test.ts new file mode 100644 index 0000000000000..44ee6713f2560 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/mute_all.test.ts @@ -0,0 +1,138 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('muteAll()', () => { + test('mutes an alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + muteAll: false, + }, + references: [], + version: '123', + }); + + await alertsClient.muteAll({ id: '1' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + muteAll: true, + mutedInstanceIds: [], + updatedBy: 'elastic', + }, + { + version: '123', + } + ); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + consumer: 'myApp', + schedule: { interval: '10s' }, + alertTypeId: 'myType', + apiKey: null, + apiKeyOwner: null, + enabled: false, + scheduledTaskId: null, + updatedBy: 'elastic', + muteAll: false, + }, + references: [], + }); + }); + + test('ensures user is authorised to muteAll this type of alert under the consumer', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.muteAll({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'muteAll'); + expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); + }); + + test('throws when user is not authorised to muteAll this type of alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to muteAll a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.muteAll({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to muteAll a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'muteAll'); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/mute_instance.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/mute_instance.test.ts new file mode 100644 index 0000000000000..dc9a1600a5776 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/mute_instance.test.ts @@ -0,0 +1,181 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('muteInstance()', () => { + test('mutes an alert instance', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + schedule: { interval: '10s' }, + alertTypeId: '2', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: [], + }, + version: '123', + references: [], + }); + + await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + mutedInstanceIds: ['2'], + updatedBy: 'elastic', + }, + { + version: '123', + } + ); + }); + + test('skips muting when alert instance already muted', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + schedule: { interval: '10s' }, + alertTypeId: '2', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: ['2'], + }, + references: [], + }); + + await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + }); + + test('skips muting when alert is muted', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + schedule: { interval: '10s' }, + alertTypeId: '2', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: [], + muteAll: true, + }, + references: [], + }); + + await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + schedule: { interval: '10s' }, + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: [], + }, + version: '123', + references: [], + }); + }); + + test('ensures user is authorised to muteInstance this type of alert under the consumer', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }); + + expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'muteInstance' + ); + }); + + test('throws when user is not authorised to muteInstance this type of alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to muteInstance a "myType" alert for "myApp"`) + ); + + await expect( + alertsClient.muteInstance({ alertId: '1', alertInstanceId: '2' }) + ).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to muteInstance a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'muteInstance' + ); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/unmute_all.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/unmute_all.test.ts new file mode 100644 index 0000000000000..45920db105c2a --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/unmute_all.test.ts @@ -0,0 +1,139 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('unmuteAll()', () => { + test('unmutes an alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + muteAll: true, + }, + references: [], + version: '123', + }); + + await alertsClient.unmuteAll({ id: '1' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + muteAll: false, + mutedInstanceIds: [], + updatedBy: 'elastic', + }, + { + version: '123', + } + ); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + consumer: 'myApp', + schedule: { interval: '10s' }, + alertTypeId: 'myType', + apiKey: null, + apiKeyOwner: null, + enabled: false, + scheduledTaskId: null, + updatedBy: 'elastic', + muteAll: false, + }, + references: [], + }); + }); + + test('ensures user is authorised to unmuteAll this type of alert under the consumer', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.unmuteAll({ id: '1' }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'unmuteAll'); + expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); + }); + + test('throws when user is not authorised to unmuteAll this type of alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to unmuteAll a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.unmuteAll({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to unmuteAll a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'unmuteAll'); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/unmute_instance.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/unmute_instance.test.ts new file mode 100644 index 0000000000000..5604011501130 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/unmute_instance.test.ts @@ -0,0 +1,179 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('unmuteInstance()', () => { + test('unmutes an alert instance', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + schedule: { interval: '10s' }, + alertTypeId: '2', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: ['2'], + }, + version: '123', + references: [], + }); + + await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + mutedInstanceIds: [], + updatedBy: 'elastic', + }, + { version: '123' } + ); + }); + + test('skips unmuting when alert instance not muted', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + schedule: { interval: '10s' }, + alertTypeId: '2', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: [], + }, + references: [], + }); + + await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + }); + + test('skips unmuting when alert is muted', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [], + schedule: { interval: '10s' }, + alertTypeId: '2', + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: [], + muteAll: true, + }, + references: [], + }); + + await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); + expect(unsecuredSavedObjectsClient.create).not.toHaveBeenCalled(); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + alertTypeId: 'myType', + consumer: 'myApp', + schedule: { interval: '10s' }, + enabled: true, + scheduledTaskId: 'task-123', + mutedInstanceIds: ['2'], + }, + version: '123', + references: [], + }); + }); + + test('ensures user is authorised to unmuteInstance this type of alert under the consumer', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + await alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }); + + expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'unmuteInstance' + ); + }); + + test('throws when user is not authorised to unmuteInstance this type of alert', async () => { + const alertsClient = new AlertsClient(alertsClientParams); + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to unmuteInstance a "myType" alert for "myApp"`) + ); + + await expect( + alertsClient.unmuteInstance({ alertId: '1', alertInstanceId: '2' }) + ).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to unmuteInstance a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'unmuteInstance' + ); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/update.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/update.test.ts new file mode 100644 index 0000000000000..14275575f75f4 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/update.test.ts @@ -0,0 +1,1257 @@ +/* + * 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 { schema } from '@kbn/config-schema'; +import { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { IntervalSchedule } from '../../types'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { resolvable } from '../../test_utils'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { TaskStatus } from '../../../../task_manager/server'; +import { getBeforeSetup, setGlobalDate } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +setGlobalDate(); + +describe('update()', () => { + let alertsClient: AlertsClient; + const existingAlert = { + id: '1', + type: 'alert', + attributes: { + enabled: true, + tags: ['foo'], + alertTypeId: 'myType', + schedule: { interval: '10s' }, + consumer: 'myApp', + scheduledTaskId: 'task-123', + params: {}, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + references: [], + version: '123', + }; + const existingDecryptedAlert = { + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: Buffer.from('123:abc').toString('base64'), + }, + }; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingDecryptedAlert); + alertTypeRegistry.get.mockReturnValue({ + id: 'myType', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + async executor() {}, + producer: 'alerts', + }); + }); + + test('updates given parameters', async () => { + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: true, + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + { + group: 'default', + actionRef: 'action_1', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + { + group: 'default', + actionRef: 'action_2', + actionTypeId: 'test2', + params: { + foo: true, + }, + }, + ], + scheduledTaskId: 'task-123', + createdAt: new Date().toISOString(), + }, + updated_at: new Date().toISOString(), + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + { + name: 'action_1', + type: 'action', + id: '1', + }, + { + name: 'action_2', + type: 'action', + id: '2', + }, + ], + }); + const result = await alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '2', + params: { + foo: true, + }, + }, + ], + }, + }); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + Object { + "actionTypeId": "test2", + "group": "default", + "id": "2", + "params": Object { + "foo": true, + }, + }, + ], + "createdAt": 2019-02-12T21:01:22.479Z, + "enabled": true, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "updatedAt": 2019-02-12T21:01:22.479Z, + } + `); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionRef": "action_0", + "actionTypeId": "test", + "group": "default", + "params": Object { + "foo": true, + }, + }, + Object { + "actionRef": "action_1", + "actionTypeId": "test", + "group": "default", + "params": Object { + "foo": true, + }, + }, + Object { + "actionRef": "action_2", + "actionTypeId": "test2", + "group": "default", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "myType", + "apiKey": null, + "apiKeyOwner": null, + "consumer": "myApp", + "enabled": true, + "meta": Object { + "versionApiKeyLastmodified": "v7.10.0", + }, + "name": "abc", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "tags": Array [ + "foo", + ], + "throttle": null, + "updatedBy": "elastic", + } + `); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` + Object { + "id": "1", + "overwrite": true, + "references": Array [ + Object { + "id": "1", + "name": "action_0", + "type": "action", + }, + Object { + "id": "1", + "name": "action_1", + "type": "action", + }, + Object { + "id": "2", + "name": "action_2", + "type": "action", + }, + ], + "version": "123", + } + `); + }); + + it('calls the createApiKey function', async () => { + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '123', name: '123', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: true, + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + apiKey: Buffer.from('123:abc').toString('base64'), + scheduledTaskId: 'task-123', + }, + updated_at: new Date().toISOString(), + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + const result = await alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: '5m', + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + ], + "apiKey": "MTIzOmFiYw==", + "createdAt": 2019-02-12T21:01:22.479Z, + "enabled": true, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "updatedAt": 2019-02-12T21:01:22.479Z, + } + `); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionRef": "action_0", + "actionTypeId": "test", + "group": "default", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "myType", + "apiKey": "MTIzOmFiYw==", + "apiKeyOwner": "elastic", + "consumer": "myApp", + "enabled": true, + "meta": Object { + "versionApiKeyLastmodified": "v7.10.0", + }, + "name": "abc", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "tags": Array [ + "foo", + ], + "throttle": "5m", + "updatedBy": "elastic", + } + `); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` + Object { + "id": "1", + "overwrite": true, + "references": Array [ + Object { + "id": "1", + "name": "action_0", + "type": "action", + }, + ], + "version": "123", + } + `); + }); + + it(`doesn't call the createAPIKey function when alert is disabled`, async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue({ + ...existingDecryptedAlert, + attributes: { + ...existingDecryptedAlert.attributes, + enabled: false, + }, + }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: false, + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + scheduledTaskId: 'task-123', + apiKey: null, + }, + updated_at: new Date().toISOString(), + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + const result = await alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: '5m', + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + expect(alertsClientParams.createAPIKey).not.toHaveBeenCalled(); + expect(result).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionTypeId": "test", + "group": "default", + "id": "1", + "params": Object { + "foo": true, + }, + }, + ], + "apiKey": null, + "createdAt": 2019-02-12T21:01:22.479Z, + "enabled": false, + "id": "1", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "updatedAt": 2019-02-12T21:01:22.479Z, + } + `); + expect(unsecuredSavedObjectsClient.create).toHaveBeenCalledTimes(1); + expect(unsecuredSavedObjectsClient.create.mock.calls[0]).toHaveLength(3); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][0]).toEqual('alert'); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][1]).toMatchInlineSnapshot(` + Object { + "actions": Array [ + Object { + "actionRef": "action_0", + "actionTypeId": "test", + "group": "default", + "params": Object { + "foo": true, + }, + }, + ], + "alertTypeId": "myType", + "apiKey": null, + "apiKeyOwner": null, + "consumer": "myApp", + "enabled": false, + "meta": Object { + "versionApiKeyLastmodified": "v7.10.0", + }, + "name": "abc", + "params": Object { + "bar": true, + }, + "schedule": Object { + "interval": "10s", + }, + "scheduledTaskId": "task-123", + "tags": Array [ + "foo", + ], + "throttle": "5m", + "updatedBy": "elastic", + } + `); + expect(unsecuredSavedObjectsClient.create.mock.calls[0][2]).toMatchInlineSnapshot(` + Object { + "id": "1", + "overwrite": true, + "references": Array [ + Object { + "id": "1", + "name": "action_0", + "type": "action", + }, + ], + "version": "123", + } + `); + }); + + it('should validate params', async () => { + alertTypeRegistry.get.mockReturnValueOnce({ + id: '123', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + validate: { + params: schema.object({ + param1: schema.string(), + }), + }, + async executor() {}, + producer: 'alerts', + }); + await expect( + alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"params invalid: [param1]: expected value of type [string] but got [undefined]"` + ); + }); + + it('should trim alert name in the API key name', async () => { + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: false, + name: ' my alert name ', + schedule: { interval: '10s' }, + params: { + bar: true, + }, + createdAt: new Date().toISOString(), + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + scheduledTaskId: 'task-123', + apiKey: null, + }, + updated_at: new Date().toISOString(), + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + await alertsClient.update({ + id: '1', + data: { + ...existingAlert.attributes, + name: ' my alert name ', + }, + }); + + expect(alertsClientParams.createAPIKey).toHaveBeenCalledWith('Alerting: myType/my alert name'); + }); + + it('swallows error when invalidate API key throws', async () => { + alertsClientParams.invalidateAPIKey.mockRejectedValueOnce(new Error('Fail')); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: true, + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + scheduledTaskId: 'task-123', + }, + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + ], + }); + await alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'Failed to invalidate API Key: Fail' + ); + }); + + it('swallows error when getDecryptedAsInternalUser throws', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValue(new Error('Fail')); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + { + id: '2', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test2', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + enabled: true, + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + { + group: 'default', + actionRef: 'action_1', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + { + group: 'default', + actionRef: 'action_2', + actionTypeId: 'test2', + params: { + foo: true, + }, + }, + ], + scheduledTaskId: 'task-123', + createdAt: new Date().toISOString(), + }, + updated_at: new Date().toISOString(), + references: [ + { + name: 'action_0', + type: 'action', + id: '1', + }, + { + name: 'action_1', + type: 'action', + id: '1', + }, + { + name: 'action_2', + type: 'action', + id: '2', + }, + ], + }); + await alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: '5m', + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + { + group: 'default', + id: '2', + params: { + foo: true, + }, + }, + ], + }, + }); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'update(): Failed to load API key to invalidate on alert 1: Fail' + ); + }); + + test('throws when unsecuredSavedObjectsClient update fails and invalidates newly created API key', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '234', name: '234', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + unsecuredSavedObjectsClient.create.mockRejectedValue(new Error('Fail')); + await expect( + alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }) + ).rejects.toThrowErrorMatchingInlineSnapshot(`"Fail"`); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalledWith({ id: '123' }); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '234' }); + }); + + describe('updating an alert schedule', () => { + function mockApiCalls( + alertId: string, + taskId: string, + currentSchedule: IntervalSchedule, + updatedSchedule: IntervalSchedule + ) { + // mock return values from deps + alertTypeRegistry.get.mockReturnValueOnce({ + id: '123', + name: 'Test', + actionGroups: [{ id: 'default', name: 'Default' }], + defaultActionGroupId: 'default', + async executor() {}, + producer: 'alerts', + }); + unsecuredSavedObjectsClient.bulkGet.mockResolvedValueOnce({ + saved_objects: [ + { + id: '1', + type: 'action', + attributes: { + actions: [], + actionTypeId: 'test', + }, + references: [], + }, + ], + }); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValueOnce({ + id: alertId, + type: 'alert', + attributes: { + actions: [], + enabled: true, + alertTypeId: '123', + schedule: currentSchedule, + scheduledTaskId: 'task-123', + }, + references: [], + version: '123', + }); + + taskManager.schedule.mockResolvedValueOnce({ + id: taskId, + taskType: 'alerting:123', + scheduledAt: new Date(), + attempts: 1, + status: TaskStatus.Idle, + runAt: new Date(), + startedAt: null, + retryAt: null, + state: {}, + params: {}, + ownerId: null, + }); + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: alertId, + type: 'alert', + attributes: { + enabled: true, + schedule: updatedSchedule, + actions: [ + { + group: 'default', + actionRef: 'action_0', + actionTypeId: 'test', + params: { + foo: true, + }, + }, + ], + scheduledTaskId: taskId, + }, + references: [ + { + name: 'action_0', + type: 'action', + id: alertId, + }, + ], + }); + + taskManager.runNow.mockReturnValueOnce(Promise.resolve({ id: alertId })); + } + + test('updating the alert schedule should rerun the task immediately', async () => { + const alertId = uuid.v4(); + const taskId = uuid.v4(); + + mockApiCalls(alertId, taskId, { interval: '60m' }, { interval: '10s' }); + + await alertsClient.update({ + id: alertId, + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + + expect(taskManager.runNow).toHaveBeenCalledWith(taskId); + }); + + test('updating the alert without changing the schedule should not rerun the task', async () => { + const alertId = uuid.v4(); + const taskId = uuid.v4(); + + mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '10s' }); + + await alertsClient.update({ + id: alertId, + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + + expect(taskManager.runNow).not.toHaveBeenCalled(); + }); + + test('updating the alert should not wait for the rerun the task to complete', async () => { + const alertId = uuid.v4(); + const taskId = uuid.v4(); + + mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '30s' }); + + const resolveAfterAlertUpdatedCompletes = resolvable<{ id: string }>(); + + taskManager.runNow.mockReset(); + taskManager.runNow.mockReturnValue(resolveAfterAlertUpdatedCompletes); + + await alertsClient.update({ + id: alertId, + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + + expect(taskManager.runNow).toHaveBeenCalled(); + resolveAfterAlertUpdatedCompletes.resolve({ id: alertId }); + }); + + test('logs when the rerun of an alerts underlying task fails', async () => { + const alertId = uuid.v4(); + const taskId = uuid.v4(); + + mockApiCalls(alertId, taskId, { interval: '10s' }, { interval: '30s' }); + + taskManager.runNow.mockReset(); + taskManager.runNow.mockRejectedValue(new Error('Failed to run alert')); + + await alertsClient.update({ + id: alertId, + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [ + { + group: 'default', + id: '1', + params: { + foo: true, + }, + }, + ], + }, + }); + + expect(taskManager.runNow).toHaveBeenCalled(); + + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + `Alert update failed to run its underlying task. TaskManager runNow failed with Error: Failed to run alert` + ); + }); + }); + + describe('authorization', () => { + beforeEach(() => { + unsecuredSavedObjectsClient.create.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + schedule: { interval: '10s' }, + params: { + bar: true, + }, + actions: [], + scheduledTaskId: 'task-123', + createdAt: new Date().toISOString(), + }, + updated_at: new Date().toISOString(), + references: [], + }); + }); + + test('ensures user is authorised to update this type of alert under the consumer', async () => { + await alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [], + }, + }); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'update'); + }); + + test('throws when user is not authorised to update this type of alert', async () => { + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to update a "myType" alert for "myApp"`) + ); + + await expect( + alertsClient.update({ + id: '1', + data: { + schedule: { interval: '10s' }, + name: 'abc', + tags: ['foo'], + params: { + bar: true, + }, + throttle: null, + actions: [], + }, + }) + ).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to update a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith('myType', 'myApp', 'update'); + }); + }); +}); diff --git a/x-pack/plugins/alerts/server/alerts_client/tests/update_api_key.test.ts b/x-pack/plugins/alerts/server/alerts_client/tests/update_api_key.test.ts new file mode 100644 index 0000000000000..97ddfa5e4adb4 --- /dev/null +++ b/x-pack/plugins/alerts/server/alerts_client/tests/update_api_key.test.ts @@ -0,0 +1,229 @@ +/* + * 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 { AlertsClient, ConstructorOptions } from '../alerts_client'; +import { savedObjectsClientMock, loggingSystemMock } from '../../../../../../src/core/server/mocks'; +import { taskManagerMock } from '../../../../task_manager/server/task_manager.mock'; +import { alertTypeRegistryMock } from '../../alert_type_registry.mock'; +import { alertsAuthorizationMock } from '../../authorization/alerts_authorization.mock'; +import { encryptedSavedObjectsMock } from '../../../../encrypted_saved_objects/server/mocks'; +import { actionsAuthorizationMock } from '../../../../actions/server/mocks'; +import { AlertsAuthorization } from '../../authorization/alerts_authorization'; +import { ActionsAuthorization } from '../../../../actions/server'; +import { getBeforeSetup } from './lib'; + +const taskManager = taskManagerMock.start(); +const alertTypeRegistry = alertTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertsAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); + +const kibanaVersion = 'v7.10.0'; +const alertsClientParams: jest.Mocked = { + taskManager, + alertTypeRegistry, + unsecuredSavedObjectsClient, + authorization: (authorization as unknown) as AlertsAuthorization, + actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + getUserName: jest.fn(), + createAPIKey: jest.fn(), + invalidateAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, +}; + +beforeEach(() => { + getBeforeSetup(alertsClientParams, taskManager, alertTypeRegistry); +}); + +describe('updateApiKey()', () => { + let alertsClient: AlertsClient; + const existingAlert = { + id: '1', + type: 'alert', + attributes: { + schedule: { interval: '10s' }, + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + }, + version: '123', + references: [], + }; + const existingEncryptedAlert = { + ...existingAlert, + attributes: { + ...existingAlert.attributes, + apiKey: Buffer.from('123:abc').toString('base64'), + }, + }; + + beforeEach(() => { + alertsClient = new AlertsClient(alertsClientParams); + unsecuredSavedObjectsClient.get.mockResolvedValue(existingAlert); + encryptedSavedObjects.getDecryptedAsInternalUser.mockResolvedValue(existingEncryptedAlert); + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '234', name: '123', api_key: 'abc' }, + }); + }); + + test('updates the API key for the alert', async () => { + await alertsClient.updateApiKey({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).not.toHaveBeenCalled(); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + schedule: { interval: '10s' }, + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + apiKey: Buffer.from('234:abc').toString('base64'), + apiKeyOwner: 'elastic', + updatedBy: 'elastic', + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + meta: { + versionApiKeyLastmodified: kibanaVersion, + }, + }, + { version: '123' } + ); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '123' }); + }); + + test('falls back to SOC when getDecryptedAsInternalUser throws an error', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); + + await alertsClient.updateApiKey({ id: '1' }); + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledWith('alert', '1'); + expect(encryptedSavedObjects.getDecryptedAsInternalUser).toHaveBeenCalledWith('alert', '1', { + namespace: 'default', + }); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalledWith( + 'alert', + '1', + { + schedule: { interval: '10s' }, + alertTypeId: 'myType', + consumer: 'myApp', + enabled: true, + apiKey: Buffer.from('234:abc').toString('base64'), + apiKeyOwner: 'elastic', + updatedBy: 'elastic', + actions: [ + { + group: 'default', + id: '1', + actionTypeId: '1', + actionRef: '1', + params: { + foo: true, + }, + }, + ], + meta: { + versionApiKeyLastmodified: kibanaVersion, + }, + }, + { version: '123' } + ); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + }); + + test('swallows error when invalidate API key throws', async () => { + alertsClientParams.invalidateAPIKey.mockRejectedValue(new Error('Fail')); + + await alertsClient.updateApiKey({ id: '1' }); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'Failed to invalidate API Key: Fail' + ); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); + }); + + test('swallows error when getting decrypted object throws', async () => { + encryptedSavedObjects.getDecryptedAsInternalUser.mockRejectedValueOnce(new Error('Fail')); + + await alertsClient.updateApiKey({ id: '1' }); + expect(alertsClientParams.logger.error).toHaveBeenCalledWith( + 'updateApiKey(): Failed to load API key to invalidate on alert 1: Fail' + ); + expect(unsecuredSavedObjectsClient.update).toHaveBeenCalled(); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalled(); + }); + + test('throws when unsecuredSavedObjectsClient update fails and invalidates newly created API key', async () => { + alertsClientParams.createAPIKey.mockResolvedValueOnce({ + apiKeysEnabled: true, + result: { id: '234', name: '234', api_key: 'abc' }, + }); + unsecuredSavedObjectsClient.update.mockRejectedValueOnce(new Error('Fail')); + + await expect(alertsClient.updateApiKey({ id: '1' })).rejects.toThrowErrorMatchingInlineSnapshot( + `"Fail"` + ); + expect(alertsClientParams.invalidateAPIKey).not.toHaveBeenCalledWith({ id: '123' }); + expect(alertsClientParams.invalidateAPIKey).toHaveBeenCalledWith({ id: '234' }); + }); + + describe('authorization', () => { + test('ensures user is authorised to updateApiKey this type of alert under the consumer', async () => { + await alertsClient.updateApiKey({ id: '1' }); + + expect(actionsAuthorization.ensureAuthorized).toHaveBeenCalledWith('execute'); + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'updateApiKey' + ); + }); + + test('throws when user is not authorised to updateApiKey this type of alert', async () => { + authorization.ensureAuthorized.mockRejectedValue( + new Error(`Unauthorized to updateApiKey a "myType" alert for "myApp"`) + ); + + await expect(alertsClient.updateApiKey({ id: '1' })).rejects.toMatchInlineSnapshot( + `[Error: Unauthorized to updateApiKey a "myType" alert for "myApp"]` + ); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith( + 'myType', + 'myApp', + 'updateApiKey' + ); + }); + }); +}); From 1290ef479f356e8e929e3f27468b2a6d87d1b2d2 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Tue, 13 Oct 2020 16:30:32 +0200 Subject: [PATCH 41/85] [Lens] Smokescreen lens test unskip (#80190) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/test/functional/apps/lens/smokescreen.ts | 6 ++++-- x-pack/test/functional/page_objects/lens_page.ts | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/x-pack/test/functional/apps/lens/smokescreen.ts b/x-pack/test/functional/apps/lens/smokescreen.ts index d26c92a2bcd63..6c4fa94a259e9 100644 --- a/x-pack/test/functional/apps/lens/smokescreen.ts +++ b/x-pack/test/functional/apps/lens/smokescreen.ts @@ -13,8 +13,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const listingTable = getService('listingTable'); const testSubjects = getService('testSubjects'); - // Failing: See https://github.com/elastic/kibana/issues/77969 - describe.skip('lens smokescreen tests', () => { + describe('lens smokescreen tests', () => { it('should allow creation of lens xy chart', async () => { await PageObjects.visualize.navigateToNewVisualization(); await PageObjects.visualize.clickVisType('lens'); @@ -153,6 +152,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { dimension: 'lnsXY_yDimensionPanel > lns-dimensionTrigger', operation: 'max', field: 'memory', + keepOpen: true, }); await PageObjects.lens.editDimensionLabel('Test of label'); await PageObjects.lens.editDimensionFormat('Percent'); @@ -160,6 +160,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.editMissingValues('Linear'); await PageObjects.lens.assertMissingValues('Linear'); + + await PageObjects.lens.openDimensionEditor('lnsXY_yDimensionPanel > lns-dimensionTrigger'); await PageObjects.lens.assertColor('#ff0000'); await testSubjects.existOrFail('indexPattern-dimension-formatDecimals'); diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index ec7281e53c5e1..f8ecacbc1141d 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -114,6 +114,18 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont } }, + /** + * Open the specified dimension. + * + * @param dimension - the selector of the dimension panel to open + * @param layerIndex - the index of the layer + */ + async openDimensionEditor(dimension: string, layerIndex = 0) { + await retry.try(async () => { + await testSubjects.click(`lns-layerPanel-${layerIndex} > ${dimension}`); + }); + }, + // closes the dimension editor flyout async closeDimensionEditor() { await testSubjects.click('lns-indexPattern-dimensionContainerTitle'); From f4534674f2dcdf8cc0b0c910142e5bda28048d1c Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Tue, 13 Oct 2020 16:54:15 +0200 Subject: [PATCH 42/85] [ML] Fixes for anomaly swim lane (#80299) * [ML] add swim lane styles for dark theme * [ML] fix global time range update on sell selection * [ML] fix getSelectionTimeRange * [ML] fix range selection for embeddable * [ML] fix job selection * [ML] fix swim lane limit --- .../components/job_selector/job_selector.tsx | 36 +++-- .../job_selector/job_selector_flyout.tsx | 4 +- .../job_selector/use_job_selection.ts | 2 +- .../date_picker_wrapper.tsx | 2 +- .../application/explorer/explorer_utils.js | 2 +- .../explorer/hooks/use_selected_cells.ts | 2 +- .../explorer/swimlane_container.tsx | 136 ++++++++++-------- .../application/routing/routes/explorer.tsx | 12 +- .../ml/public/application/util/url_state.tsx | 6 +- .../anomaly_swimlane_embeddable.tsx | 25 ++-- .../embeddable_swim_lane_container.tsx | 2 +- .../ui_actions/apply_time_range_action.tsx | 3 +- 12 files changed, 123 insertions(+), 109 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx index a00284860d668..d25d2c3a858ed 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { EuiButtonEmpty, EuiFlexItem, EuiFlexGroup, EuiFlyout } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -109,24 +109,22 @@ export function JobSelector({ dateFormatTz, singleSelection, timeseriesOnly }: J showFlyout(); } - const applySelection: JobSelectorFlyoutProps['onSelectionConfirmed'] = ({ - newSelection, - jobIds, - groups: newGroups, - time, - }) => { - setSelectedIds(newSelection); - - setGlobalState({ - ml: { - jobIds, - groups: newGroups, - }, - ...(time !== undefined ? { time } : {}), - }); - - closeFlyout(); - }; + const applySelection: JobSelectorFlyoutProps['onSelectionConfirmed'] = useCallback( + ({ newSelection, jobIds, groups: newGroups, time }) => { + setSelectedIds(newSelection); + + setGlobalState({ + ml: { + jobIds, + groups: newGroups, + }, + ...(time !== undefined ? { time } : {}), + }); + + closeFlyout(); + }, + [setGlobalState, setSelectedIds] + ); function renderJobSelectionBar() { return ( diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx index 1e8ac4c15fd15..a90eb8cfde532 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx @@ -82,7 +82,7 @@ export const JobSelectorFlyoutContent: FC = ({ const flyoutEl = useRef(null); - function applySelection() { + const applySelection = useCallback(() => { // allNewSelection will be a list of all job ids (including those from groups) selected from the table const allNewSelection: string[] = []; const groupSelection: Array<{ groupId: string; jobIds: string[] }> = []; @@ -110,7 +110,7 @@ export const JobSelectorFlyoutContent: FC = ({ groups: groupSelection, time, }); - } + }, [onSelectionConfirmed, newSelection, jobGroupsMaps, applyTimeRange]); function removeId(id: string) { setNewSelection(newSelection.filter((item) => item !== id)); diff --git a/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts b/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts index 0717348d1db22..04fa3e9201c6c 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts +++ b/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts @@ -88,7 +88,7 @@ export const useJobSelection = (jobs: MlJobWithTimeRange[]) => { ...(time !== undefined ? { time } : {}), }); } - }, [jobs, validIds]); + }, [jobs, validIds, setGlobalState, globalState?.ml]); return jobSelection; }; diff --git a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx index beafae1ecd2f6..409bd11e0bde3 100644 --- a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx @@ -54,7 +54,7 @@ export const DatePickerWrapper: FC = () => { useEffect(() => { setGlobalState({ refreshInterval }); timefilter.setRefreshInterval(refreshInterval); - }, [refreshInterval?.pause, refreshInterval?.value]); + }, [refreshInterval?.pause, refreshInterval?.value, setGlobalState]); const [time, setTime] = useState(timefilter.getTime()); const [recentlyUsedRanges, setRecentlyUsedRanges] = useState(getRecentlyUsedRanges()); diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js index c309e1f4ef8e8..c3bdacde5abd8 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_utils.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_utils.js @@ -198,7 +198,7 @@ export function getSelectionTimeRange(selectedCells, interval, bounds) { latestMs = bounds.max.valueOf(); if (selectedCells.times[1] !== undefined) { // Subtract 1 ms so search does not include start of next bucket. - latestMs = (selectedCells.times[1] + interval) * 1000 - 1; + latestMs = selectedCells.times[1] * 1000 - 1; } } diff --git a/x-pack/plugins/ml/public/application/explorer/hooks/use_selected_cells.ts b/x-pack/plugins/ml/public/application/explorer/hooks/use_selected_cells.ts index f356d79c0a8e1..c7cda2372bceb 100644 --- a/x-pack/plugins/ml/public/application/explorer/hooks/use_selected_cells.ts +++ b/x-pack/plugins/ml/public/application/explorer/hooks/use_selected_cells.ts @@ -60,7 +60,7 @@ export const useSelectedCells = ( setAppState('mlExplorerSwimlane', mlExplorerSwimlane); } }, - [appState?.mlExplorerSwimlane, selectedCells] + [appState?.mlExplorerSwimlane, selectedCells, setAppState] ); return [selectedCells, setSelectedCells]; diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 0a2791edb9c50..9d6d6c14ed659 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -41,6 +41,7 @@ import { getFormattedSeverityScore } from '../../../common/util/anomaly_utils'; import './_explorer.scss'; import { EMPTY_FIELD_VALUE_LABEL } from '../timeseriesexplorer/components/entity_control/entity_control'; +import { useUiSettings } from '../contexts/kibana'; /** * Ignore insignificant resize, e.g. browser scrollbar appearance. @@ -159,6 +160,8 @@ export const SwimlaneContainer: FC = ({ }) => { const [chartWidth, setChartWidth] = useState(0); + const isDarkTheme = !!useUiSettings().get('theme:darkMode'); + // Holds the container height for previously fetched data const containerHeightRef = useRef(); @@ -235,67 +238,76 @@ export const SwimlaneContainer: FC = ({ return { x: selection.times.map((v) => v * 1000), y: selection.lanes }; }, [selection, swimlaneData, swimlaneType]); - const swimLaneConfig: HeatmapSpec['config'] = useMemo( - () => - showSwimlane - ? { - onBrushEnd: (e: HeatmapBrushEvent) => { - onCellsSelection({ - lanes: e.y as string[], - times: e.x.map((v) => (v as number) / 1000), - type: swimlaneType, - viewByFieldName: swimlaneData.fieldName, - }); - }, - grid: { - cellHeight: { - min: CELL_HEIGHT, - max: CELL_HEIGHT, - }, - stroke: { - width: 1, - color: '#D3DAE6', - }, - }, - cell: { - maxWidth: 'fill', - maxHeight: 'fill', - label: { - visible: false, - }, - border: { - stroke: '#D3DAE6', - strokeWidth: 0, - }, - }, - yAxisLabel: { - visible: true, - width: 170, - // eui color subdued - fill: `#6a717d`, - padding: 8, - formatter: (laneLabel: string) => { - return laneLabel === '' ? EMPTY_FIELD_VALUE_LABEL : laneLabel; - }, - }, - xAxisLabel: { - visible: showTimeline, - // eui color subdued - fill: `#98A2B3`, - formatter: (v: number) => { - timeBuckets.setInterval(`${swimlaneData.interval}s`); - const a = timeBuckets.getScaledDateFormat(); - return moment(v).format(a); - }, - }, - brushMask: { - fill: 'rgb(247 247 247 / 50%)', - }, - maxLegendHeight: LEGEND_HEIGHT, - } - : {}, - [showSwimlane, swimlaneType, swimlaneData?.fieldName] - ); + const swimLaneConfig: HeatmapSpec['config'] = useMemo(() => { + if (!showSwimlane) return {}; + + return { + onBrushEnd: (e: HeatmapBrushEvent) => { + onCellsSelection({ + lanes: e.y as string[], + times: e.x.map((v) => (v as number) / 1000), + type: swimlaneType, + viewByFieldName: swimlaneData.fieldName, + }); + }, + grid: { + cellHeight: { + min: CELL_HEIGHT, + max: CELL_HEIGHT, + }, + stroke: { + width: 1, + color: '#D3DAE6', + }, + }, + cell: { + maxWidth: 'fill', + maxHeight: 'fill', + label: { + visible: false, + }, + border: { + stroke: '#D3DAE6', + strokeWidth: 0, + }, + }, + yAxisLabel: { + visible: true, + width: 170, + // eui color subdued + fill: `#6a717d`, + padding: 8, + formatter: (laneLabel: string) => { + return laneLabel === '' ? EMPTY_FIELD_VALUE_LABEL : laneLabel; + }, + }, + xAxisLabel: { + visible: showTimeline, + // eui color subdued + fill: `#98A2B3`, + formatter: (v: number) => { + timeBuckets.setInterval(`${swimlaneData.interval}s`); + const scaledDateFormat = timeBuckets.getScaledDateFormat(); + return moment(v).format(scaledDateFormat); + }, + }, + brushMask: { + fill: isDarkTheme ? 'rgb(30,31,35,80%)' : 'rgb(247,247,247,50%)', + }, + brushArea: { + stroke: isDarkTheme ? 'rgb(255, 255, 255)' : 'rgb(105, 112, 125)', + }, + maxLegendHeight: LEGEND_HEIGHT, + timeZone: 'UTC', + }; + }, [ + showSwimlane, + swimlaneType, + swimlaneData?.fieldName, + isDarkTheme, + timeBuckets, + onCellsSelection, + ]); // @ts-ignore const onElementClick: ElementClickListener = useCallback( @@ -310,7 +322,7 @@ export const SwimlaneContainer: FC = ({ }; onCellsSelection(payload); }, - [swimlaneType, swimlaneData?.fieldName, swimlaneData?.interval] + [swimlaneType, swimlaneData?.fieldName, swimlaneData?.interval, onCellsSelection] ); const tooltipOptions: TooltipSettings = useMemo( diff --git a/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx b/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx index 00d64a2f1bd1d..cb6944e0ecf05 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx @@ -82,8 +82,9 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim const { jobIds } = useJobSelection(jobsWithTimeRange); const refresh = useRefresh(); + useEffect(() => { - if (refresh !== undefined) { + if (refresh !== undefined && lastRefresh !== refresh.lastRefresh) { setLastRefresh(refresh?.lastRefresh); if (refresh.timeRange !== undefined) { @@ -94,7 +95,7 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim }); } } - }, [refresh?.lastRefresh]); + }, [refresh?.lastRefresh, lastRefresh, setLastRefresh, setGlobalState]); // We cannot simply infer bounds from the globalState's `time` attribute // with `moment` since it can contain custom strings such as `now-15m`. @@ -194,6 +195,7 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim const [tableSeverity] = useTableSeverity(); const [selectedCells, setSelectedCells] = useSelectedCells(appState, setAppState); + useEffect(() => { explorerService.setSelectedCells(selectedCells); }, [JSON.stringify(selectedCells)]); @@ -220,9 +222,9 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim if (explorerState && explorerState.swimlaneContainerWidth > 0) { loadExplorerData({ ...loadExplorerDataConfig, - swimlaneLimit: - isViewBySwimLaneData(explorerState?.viewBySwimlaneData) && - explorerState?.viewBySwimlaneData.cardinality, + swimlaneLimit: isViewBySwimLaneData(explorerState?.viewBySwimlaneData) + ? explorerState?.viewBySwimlaneData.cardinality + : undefined, }); } }, [JSON.stringify(loadExplorerDataConfig)]); diff --git a/x-pack/plugins/ml/public/application/util/url_state.tsx b/x-pack/plugins/ml/public/application/util/url_state.tsx index c288a00bb06da..a3c70e1130904 100644 --- a/x-pack/plugins/ml/public/application/util/url_state.tsx +++ b/x-pack/plugins/ml/public/application/util/url_state.tsx @@ -140,12 +140,12 @@ export const useUrlState = (accessor: Accessor) => { if (typeof fullUrlState === 'object') { return fullUrlState[accessor]; } - return undefined; }, [searchString]); const setUrlState = useCallback( - (attribute: string | Dictionary, value?: any) => - setUrlStateContext(accessor, attribute, value), + (attribute: string | Dictionary, value?: any) => { + setUrlStateContext(accessor, attribute, value); + }, [accessor, setUrlStateContext] ); return [urlState, setUrlState]; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx index 6e67ff1aef03d..4730371c611c1 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx @@ -9,6 +9,7 @@ import ReactDOM from 'react-dom'; import { CoreStart } from 'kibana/public'; import { i18n } from '@kbn/i18n'; import { Subject } from 'rxjs'; +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; import { Embeddable, IContainer } from '../../../../../../src/plugins/embeddable/public'; import { EmbeddableSwimLaneContainer } from './embeddable_swim_lane_container_lazy'; import type { JobId } from '../../../common/types/anomaly_detection_jobs'; @@ -59,17 +60,19 @@ export class AnomalySwimlaneEmbeddable extends Embeddable< ReactDOM.render( - - - + + + + + , node ); diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx index 17ae97e3c07bb..5efe70ba552f5 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx @@ -89,7 +89,7 @@ export const EmbeddableSwimLaneContainer: FC = ( }); } }, - [swimlaneData, perPage, fromPage] + [swimlaneData, perPage, fromPage, setSelectedCells] ); if (error) { diff --git a/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx b/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx index 325e903de0e2d..79e6ff53bff43 100644 --- a/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx @@ -39,8 +39,7 @@ export function createApplyTimeRangeSelectionAction( let [from, to] = data.times; from = from * 1000; - // extend bounds with the interval - to = to * 1000 + interval * 1000; + to = to * 1000; timefilter.setTime({ from: moment(from), From 255b865be8131fc7012a968d675f3c9113ed0bdd Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Tue, 13 Oct 2020 17:00:38 +0200 Subject: [PATCH 43/85] removing kibana_datatable` in favor of `datatable` (#75184) --- ...beddable-public.rangeselectcontext.data.md | 2 +- ...ns-embeddable-public.rangeselectcontext.md | 2 +- ...mbeddable-public.valueclickcontext.data.md | 2 +- ...ins-embeddable-public.valueclickcontext.md | 2 +- ...-expressions-public.datatablecolumntype.md | 4 +- ...ressions-public.kibanadatatable.columns.md | 11 - ...gins-expressions-public.kibanadatatable.md | 20 -- ...expressions-public.kibanadatatable.rows.md | 11 - ...expressions-public.kibanadatatable.type.md | 11 - ...public.kibanadatatablecolumn.formathint.md | 11 - ...essions-public.kibanadatatablecolumn.id.md | 11 - ...xpressions-public.kibanadatatablecolumn.md | 21 -- ...sions-public.kibanadatatablecolumn.meta.md | 11 - ...sions-public.kibanadatatablecolumn.name.md | 11 - ...banadatatablecolumnmeta.aggconfigparams.md | 11 - ...ibanadatatablecolumnmeta.indexpatternid.md | 11 - ...ssions-public.kibanadatatablecolumnmeta.md | 20 -- ...s-public.kibanadatatablecolumnmeta.type.md | 11 - ...s-expressions-public.kibanadatatablerow.md | 11 - ...ibana-plugin-plugins-expressions-public.md | 6 +- ...-expressions-server.datatablecolumntype.md | 4 +- ...ressions-server.kibanadatatable.columns.md | 11 - ...gins-expressions-server.kibanadatatable.md | 20 -- ...expressions-server.kibanadatatable.rows.md | 11 - ...expressions-server.kibanadatatable.type.md | 11 - ...server.kibanadatatablecolumn.formathint.md | 11 - ...essions-server.kibanadatatablecolumn.id.md | 11 - ...xpressions-server.kibanadatatablecolumn.md | 21 -- ...sions-server.kibanadatatablecolumn.meta.md | 11 - ...sions-server.kibanadatatablecolumn.name.md | 11 - ...banadatatablecolumnmeta.aggconfigparams.md | 11 - ...ibanadatatablecolumnmeta.indexpatternid.md | 11 - ...ssions-server.kibanadatatablecolumnmeta.md | 20 -- ...s-server.kibanadatatablecolumnmeta.type.md | 11 - ...s-expressions-server.kibanadatatablerow.md | 11 - ...ibana-plugin-plugins-expressions-server.md | 6 +- .../data/common/search/expressions/esaggs.ts | 4 +- .../create_filters_from_range_select.test.ts | 53 +++-- .../create_filters_from_range_select.ts | 17 +- .../create_filters_from_value_click.test.ts | 20 +- .../create_filters_from_value_click.ts | 36 ++-- .../data/public/search/expressions/esaggs.ts | 38 ++-- .../data/public/search/expressions/index.ts | 1 - .../public/search/expressions/utils/index.ts | 20 -- .../expressions/utils/serialize_agg_config.ts | 54 ----- .../public/lib/triggers/triggers.ts | 6 +- src/plugins/embeddable/public/public.api.md | 10 +- .../expression_types/specs/datatable.ts | 41 +++- .../common/expression_types/specs/index.ts | 3 - .../specs/kibana_datatable.ts | 75 ------- src/plugins/expressions/public/index.ts | 4 - src/plugins/expressions/public/public.api.md | 52 +---- src/plugins/expressions/server/index.ts | 4 - src/plugins/expressions/server/server.api.md | 52 +---- .../public/input_control_fn.ts | 4 +- .../__snapshots__/region_map_fn.test.js.snap | 2 +- .../region_map/public/region_map_fn.js | 2 +- .../region_map/public/region_map_fn.test.js | 2 +- src/plugins/tile_map/public/tile_map_fn.js | 2 +- .../tile_map/public/tile_map_visualization.js | 16 +- .../tile_map/public/tilemap_fn.test.js | 2 +- .../public/markdown_renderer.tsx | 2 +- .../__snapshots__/metric_vis_fn.test.ts.snap | 2 +- .../components/metric_vis_component.tsx | 4 +- .../public/metric_vis_fn.test.ts | 2 +- .../vis_type_metric/public/metric_vis_fn.ts | 6 +- .../public/metric_vis_renderer.tsx | 6 +- .../public/table_vis_fn.test.ts | 2 +- .../vis_type_table/public/table_vis_fn.ts | 6 +- .../__snapshots__/tag_cloud_fn.test.ts.snap | 2 +- .../public/tag_cloud_fn.test.ts | 2 +- .../vis_type_tagcloud/public/tag_cloud_fn.ts | 8 +- .../public/tag_cloud_vis_renderer.tsx | 2 +- .../public/timelion_vis_renderer.tsx | 2 +- .../vis_type_vislib/public/pie_fn.test.ts | 2 +- src/plugins/vis_type_vislib/public/pie_fn.ts | 6 +- .../public/vis_type_vislib_vis_fn.ts | 6 +- .../components/visualization_container.tsx | 5 +- .../public/expression_functions/range.ts | 4 +- .../expression_functions/vis_dimension.ts | 10 +- .../snapshots/baseline/combined_test2.json | 2 +- .../snapshots/baseline/combined_test3.json | 2 +- .../snapshots/baseline/final_output_test.json | 2 +- .../snapshots/baseline/metric_all_data.json | 2 +- .../baseline/metric_invalid_data.json | 2 +- .../baseline/metric_multi_metric_data.json | 2 +- .../baseline/metric_percentage_mode.json | 2 +- .../baseline/metric_single_metric_data.json | 2 +- .../snapshots/baseline/partial_test_1.json | 2 +- .../snapshots/baseline/partial_test_2.json | 2 +- .../snapshots/baseline/partial_test_3.json | 2 +- .../snapshots/baseline/step_output_test2.json | 2 +- .../snapshots/baseline/step_output_test3.json | 2 +- .../snapshots/baseline/tagcloud_all_data.json | 2 +- .../snapshots/baseline/tagcloud_fontsize.json | 2 +- .../baseline/tagcloud_invalid_data.json | 2 +- .../baseline/tagcloud_metric_data.json | 2 +- .../snapshots/baseline/tagcloud_options.json | 2 +- .../snapshots/session/combined_test2.json | 2 +- .../snapshots/session/combined_test3.json | 2 +- .../snapshots/session/final_output_test.json | 2 +- .../snapshots/session/metric_all_data.json | 2 +- .../session/metric_invalid_data.json | 2 +- .../session/metric_multi_metric_data.json | 2 +- .../session/metric_percentage_mode.json | 2 +- .../session/metric_single_metric_data.json | 2 +- .../snapshots/session/partial_test_1.json | 2 +- .../snapshots/session/partial_test_2.json | 2 +- .../snapshots/session/partial_test_3.json | 2 +- .../snapshots/session/step_output_test2.json | 2 +- .../snapshots/session/step_output_test3.json | 2 +- .../snapshots/session/tagcloud_all_data.json | 2 +- .../snapshots/session/tagcloud_fontsize.json | 2 +- .../session/tagcloud_invalid_data.json | 2 +- .../session/tagcloud_metric_data.json | 2 +- .../snapshots/session/tagcloud_options.json | 2 +- .../test_suites/run_pipeline/helpers.ts | 14 +- .../public/components/datatable/datatable.tsx | 6 +- x-pack/plugins/canvas/types/state.ts | 2 - .../public/lib/url_drilldown.test.ts | 18 +- .../public/lib/url_drilldown_scope.test.ts | 11 +- .../public/lib/url_drilldown_scope.ts | 4 +- .../expression.test.tsx | 70 ++++++- .../datatable_visualization/expression.tsx | 13 +- .../editor_frame_service/format_column.ts | 26 ++- .../editor_frame_service/merge_tables.test.ts | 18 +- .../editor_frame_service/merge_tables.ts | 8 +- .../rename_columns.test.ts | 56 +++-- .../indexpattern_datasource/rename_columns.ts | 18 +- .../metric_visualization/expression.test.tsx | 8 +- .../metric_visualization/expression.tsx | 4 +- .../render_function.test.tsx | 19 +- .../pie_visualization/render_function.tsx | 4 +- .../pie_visualization/render_helpers.test.ts | 55 ++--- .../pie_visualization/render_helpers.ts | 6 +- .../lens/public/pie_visualization/types.ts | 6 +- x-pack/plugins/lens/public/types.ts | 4 +- x-pack/plugins/lens/public/utils.test.ts | 8 +- x-pack/plugins/lens/public/utils.ts | 6 +- .../axes_configuration.test.ts | 132 +++++++----- .../xy_visualization/axes_configuration.ts | 9 +- .../xy_visualization/expression.test.tsx | 196 ++++++++++-------- .../public/xy_visualization/expression.tsx | 23 +- 143 files changed, 708 insertions(+), 1099 deletions(-) delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.columns.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.rows.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.type.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.formathint.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.id.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.meta.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.name.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.aggconfigparams.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.indexpatternid.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.type.md delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablerow.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.columns.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.rows.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.type.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.formathint.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.id.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.meta.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.name.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.aggconfigparams.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.indexpatternid.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.type.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablerow.md delete mode 100644 src/plugins/data/public/search/expressions/utils/index.ts delete mode 100644 src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts delete mode 100644 src/plugins/expressions/common/expression_types/specs/kibana_datatable.ts diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.data.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.data.md index 6d2774d86f109..f11003887a6df 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.data.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.data.md @@ -8,7 +8,7 @@ ```typescript data: { - table: KibanaDatatable; + table: Datatable; column: number; range: number[]; timeFieldName?: string; diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.md index 0f92ed86301da..f23cb44a7f014 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.rangeselectcontext.md @@ -14,6 +14,6 @@ export interface RangeSelectContext | Property | Type | Description | | --- | --- | --- | -| [data](./kibana-plugin-plugins-embeddable-public.rangeselectcontext.data.md) | {
table: KibanaDatatable;
column: number;
range: number[];
timeFieldName?: string;
} | | +| [data](./kibana-plugin-plugins-embeddable-public.rangeselectcontext.data.md) | {
table: Datatable;
column: number;
range: number[];
timeFieldName?: string;
} | | | [embeddable](./kibana-plugin-plugins-embeddable-public.rangeselectcontext.embeddable.md) | T | | diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.data.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.data.md index 92c33affc47a9..e7c1be172cd70 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.data.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.data.md @@ -9,7 +9,7 @@ ```typescript data: { data: Array<{ - table: Pick; + table: Pick; column: number; row: number; value: any; diff --git a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.md b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.md index 13133095956c6..875c8d276160e 100644 --- a/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.md +++ b/docs/development/plugins/embeddable/public/kibana-plugin-plugins-embeddable-public.valueclickcontext.md @@ -14,6 +14,6 @@ export interface ValueClickContext | Property | Type | Description | | --- | --- | --- | -| [data](./kibana-plugin-plugins-embeddable-public.valueclickcontext.data.md) | {
data: Array<{
table: Pick<KibanaDatatable, 'rows' | 'columns'>;
column: number;
row: number;
value: any;
}>;
timeFieldName?: string;
negate?: boolean;
} | | +| [data](./kibana-plugin-plugins-embeddable-public.valueclickcontext.data.md) | {
data: Array<{
table: Pick<Datatable, 'rows' | 'columns'>;
column: number;
row: number;
value: any;
}>;
timeFieldName?: string;
negate?: boolean;
} | | | [embeddable](./kibana-plugin-plugins-embeddable-public.valueclickcontext.embeddable.md) | T | | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.datatablecolumntype.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.datatablecolumntype.md index a06ab351e62c3..8f134bd3bfe95 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.datatablecolumntype.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.datatablecolumntype.md @@ -4,10 +4,10 @@ ## DatatableColumnType type -This type represents the `type` of any `DatatableColumn` in a `Datatable`. +This type represents the `type` of any `DatatableColumn` in a `Datatable`. its duplicated from KBN\_FIELD\_TYPES Signature: ```typescript -export declare type DatatableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'null'; +export declare type DatatableColumnType = '_source' | 'attachment' | 'boolean' | 'date' | 'geo_point' | 'geo_shape' | 'ip' | 'murmur3' | 'number' | 'string' | 'unknown' | 'conflict' | 'object' | 'nested' | 'histogram' | 'null'; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.columns.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.columns.md deleted file mode 100644 index c8aa768a883d6..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.columns.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-public.kibanadatatable.md) > [columns](./kibana-plugin-plugins-expressions-public.kibanadatatable.columns.md) - -## KibanaDatatable.columns property - -Signature: - -```typescript -columns: KibanaDatatableColumn[]; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.md deleted file mode 100644 index 4ea1d6f42b66d..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-public.kibanadatatable.md) - -## KibanaDatatable interface - -Signature: - -```typescript -export interface KibanaDatatable -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [columns](./kibana-plugin-plugins-expressions-public.kibanadatatable.columns.md) | KibanaDatatableColumn[] | | -| [rows](./kibana-plugin-plugins-expressions-public.kibanadatatable.rows.md) | KibanaDatatableRow[] | | -| [type](./kibana-plugin-plugins-expressions-public.kibanadatatable.type.md) | typeof name | | - diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.rows.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.rows.md deleted file mode 100644 index 43f3243dc4fa7..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.rows.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-public.kibanadatatable.md) > [rows](./kibana-plugin-plugins-expressions-public.kibanadatatable.rows.md) - -## KibanaDatatable.rows property - -Signature: - -```typescript -rows: KibanaDatatableRow[]; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.type.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.type.md deleted file mode 100644 index 996f59cbb77a1..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatable.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-public.kibanadatatable.md) > [type](./kibana-plugin-plugins-expressions-public.kibanadatatable.type.md) - -## KibanaDatatable.type property - -Signature: - -```typescript -type: typeof name; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.formathint.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.formathint.md deleted file mode 100644 index b517c1610261b..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.formathint.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md) > [formatHint](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.formathint.md) - -## KibanaDatatableColumn.formatHint property - -Signature: - -```typescript -formatHint?: SerializedFieldFormat; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.id.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.id.md deleted file mode 100644 index e7d43190589a7..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.id.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md) > [id](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.id.md) - -## KibanaDatatableColumn.id property - -Signature: - -```typescript -id: string; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md deleted file mode 100644 index 138c19f0ec7bd..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md +++ /dev/null @@ -1,21 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md) - -## KibanaDatatableColumn interface - -Signature: - -```typescript -export interface KibanaDatatableColumn -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [formatHint](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.formathint.md) | SerializedFieldFormat | | -| [id](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.id.md) | string | | -| [meta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.meta.md) | KibanaDatatableColumnMeta | | -| [name](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.name.md) | string | | - diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.meta.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.meta.md deleted file mode 100644 index df2d09bf3cc55..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.meta.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md) > [meta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.meta.md) - -## KibanaDatatableColumn.meta property - -Signature: - -```typescript -meta?: KibanaDatatableColumnMeta; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.name.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.name.md deleted file mode 100644 index 841ad67f3f521..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.name.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md) > [name](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.name.md) - -## KibanaDatatableColumn.name property - -Signature: - -```typescript -name: string; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.aggconfigparams.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.aggconfigparams.md deleted file mode 100644 index 2ec6edda4cbca..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.aggconfigparams.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md) > [aggConfigParams](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.aggconfigparams.md) - -## KibanaDatatableColumnMeta.aggConfigParams property - -Signature: - -```typescript -aggConfigParams?: Record; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.indexpatternid.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.indexpatternid.md deleted file mode 100644 index 2287c28398f7f..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.indexpatternid.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md) > [indexPatternId](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.indexpatternid.md) - -## KibanaDatatableColumnMeta.indexPatternId property - -Signature: - -```typescript -indexPatternId?: string; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md deleted file mode 100644 index b2f8c9d06a727..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md) - -## KibanaDatatableColumnMeta interface - -Signature: - -```typescript -export interface KibanaDatatableColumnMeta -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [aggConfigParams](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.aggconfigparams.md) | Record<string, any> | | -| [indexPatternId](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.indexpatternid.md) | string | | -| [type](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.type.md) | string | | - diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.type.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.type.md deleted file mode 100644 index 98d4a0c2d43c3..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md) > [type](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.type.md) - -## KibanaDatatableColumnMeta.type property - -Signature: - -```typescript -type: string; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablerow.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablerow.md deleted file mode 100644 index cb5f1ad70f628..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.kibanadatatablerow.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [KibanaDatatableRow](./kibana-plugin-plugins-expressions-public.kibanadatatablerow.md) - -## KibanaDatatableRow interface - -Signature: - -```typescript -export interface KibanaDatatableRow -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md index b0c732188a46e..db09f966e2fa5 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.md @@ -72,10 +72,6 @@ | [IExpressionLoaderParams](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md) | | | [IInterpreterRenderHandlers](./kibana-plugin-plugins-expressions-public.iinterpreterrenderhandlers.md) | | | [IRegistry](./kibana-plugin-plugins-expressions-public.iregistry.md) | | -| [KibanaDatatable](./kibana-plugin-plugins-expressions-public.kibanadatatable.md) | | -| [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumn.md) | | -| [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-public.kibanadatatablecolumnmeta.md) | | -| [KibanaDatatableRow](./kibana-plugin-plugins-expressions-public.kibanadatatablerow.md) | | | [PointSeriesColumn](./kibana-plugin-plugins-expressions-public.pointseriescolumn.md) | Column in a PointSeries | | [Range](./kibana-plugin-plugins-expressions-public.range.md) | | | [ReactExpressionRendererProps](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md) | | @@ -95,7 +91,7 @@ | [AnyExpressionFunctionDefinition](./kibana-plugin-plugins-expressions-public.anyexpressionfunctiondefinition.md) | Type to capture every possible expression function definition. | | [AnyExpressionTypeDefinition](./kibana-plugin-plugins-expressions-public.anyexpressiontypedefinition.md) | | | [ArgumentType](./kibana-plugin-plugins-expressions-public.argumenttype.md) | This type represents all of the possible combinations of properties of an Argument in an Expression Function. The presence or absence of certain fields influence the shape and presence of others within each arg in the specification. | -| [DatatableColumnType](./kibana-plugin-plugins-expressions-public.datatablecolumntype.md) | This type represents the type of any DatatableColumn in a Datatable. | +| [DatatableColumnType](./kibana-plugin-plugins-expressions-public.datatablecolumntype.md) | This type represents the type of any DatatableColumn in a Datatable. its duplicated from KBN\_FIELD\_TYPES | | [DatatableRow](./kibana-plugin-plugins-expressions-public.datatablerow.md) | This type represents a row in a Datatable. | | [ExecutionContainer](./kibana-plugin-plugins-expressions-public.executioncontainer.md) | | | [ExecutorContainer](./kibana-plugin-plugins-expressions-public.executorcontainer.md) | | diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.datatablecolumntype.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.datatablecolumntype.md index 4afce913526de..dc98acffa1236 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.datatablecolumntype.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.datatablecolumntype.md @@ -4,10 +4,10 @@ ## DatatableColumnType type -This type represents the `type` of any `DatatableColumn` in a `Datatable`. +This type represents the `type` of any `DatatableColumn` in a `Datatable`. its duplicated from KBN\_FIELD\_TYPES Signature: ```typescript -export declare type DatatableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'null'; +export declare type DatatableColumnType = '_source' | 'attachment' | 'boolean' | 'date' | 'geo_point' | 'geo_shape' | 'ip' | 'murmur3' | 'number' | 'string' | 'unknown' | 'conflict' | 'object' | 'nested' | 'histogram' | 'null'; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.columns.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.columns.md deleted file mode 100644 index 423e543e4307a..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.columns.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-server.kibanadatatable.md) > [columns](./kibana-plugin-plugins-expressions-server.kibanadatatable.columns.md) - -## KibanaDatatable.columns property - -Signature: - -```typescript -columns: KibanaDatatableColumn[]; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.md deleted file mode 100644 index 30ee3ac2fcd13..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-server.kibanadatatable.md) - -## KibanaDatatable interface - -Signature: - -```typescript -export interface KibanaDatatable -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [columns](./kibana-plugin-plugins-expressions-server.kibanadatatable.columns.md) | KibanaDatatableColumn[] | | -| [rows](./kibana-plugin-plugins-expressions-server.kibanadatatable.rows.md) | KibanaDatatableRow[] | | -| [type](./kibana-plugin-plugins-expressions-server.kibanadatatable.type.md) | typeof name | | - diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.rows.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.rows.md deleted file mode 100644 index 42170a83fc3c8..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.rows.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-server.kibanadatatable.md) > [rows](./kibana-plugin-plugins-expressions-server.kibanadatatable.rows.md) - -## KibanaDatatable.rows property - -Signature: - -```typescript -rows: KibanaDatatableRow[]; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.type.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.type.md deleted file mode 100644 index c36674540a1ba..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatable.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatable](./kibana-plugin-plugins-expressions-server.kibanadatatable.md) > [type](./kibana-plugin-plugins-expressions-server.kibanadatatable.type.md) - -## KibanaDatatable.type property - -Signature: - -```typescript -type: typeof name; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.formathint.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.formathint.md deleted file mode 100644 index a1e6949019dcb..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.formathint.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md) > [formatHint](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.formathint.md) - -## KibanaDatatableColumn.formatHint property - -Signature: - -```typescript -formatHint?: SerializedFieldFormat; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.id.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.id.md deleted file mode 100644 index 6f90da1ac9c94..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.id.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md) > [id](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.id.md) - -## KibanaDatatableColumn.id property - -Signature: - -```typescript -id: string; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md deleted file mode 100644 index 171477911502f..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md +++ /dev/null @@ -1,21 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md) - -## KibanaDatatableColumn interface - -Signature: - -```typescript -export interface KibanaDatatableColumn -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [formatHint](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.formathint.md) | SerializedFieldFormat | | -| [id](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.id.md) | string | | -| [meta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.meta.md) | KibanaDatatableColumnMeta | | -| [name](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.name.md) | string | | - diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.meta.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.meta.md deleted file mode 100644 index 40b20d51e6ec6..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.meta.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md) > [meta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.meta.md) - -## KibanaDatatableColumn.meta property - -Signature: - -```typescript -meta?: KibanaDatatableColumnMeta; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.name.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.name.md deleted file mode 100644 index 3a85e2325483a..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.name.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md) > [name](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.name.md) - -## KibanaDatatableColumn.name property - -Signature: - -```typescript -name: string; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.aggconfigparams.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.aggconfigparams.md deleted file mode 100644 index 539b24174f725..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.aggconfigparams.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md) > [aggConfigParams](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.aggconfigparams.md) - -## KibanaDatatableColumnMeta.aggConfigParams property - -Signature: - -```typescript -aggConfigParams?: Record; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.indexpatternid.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.indexpatternid.md deleted file mode 100644 index 2704915a15071..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.indexpatternid.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md) > [indexPatternId](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.indexpatternid.md) - -## KibanaDatatableColumnMeta.indexPatternId property - -Signature: - -```typescript -indexPatternId?: string; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md deleted file mode 100644 index d9a96e665f010..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md) - -## KibanaDatatableColumnMeta interface - -Signature: - -```typescript -export interface KibanaDatatableColumnMeta -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [aggConfigParams](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.aggconfigparams.md) | Record<string, any> | | -| [indexPatternId](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.indexpatternid.md) | string | | -| [type](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.type.md) | string | | - diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.type.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.type.md deleted file mode 100644 index 56e3757ef621a..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.type.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md) > [type](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.type.md) - -## KibanaDatatableColumnMeta.type property - -Signature: - -```typescript -type: string; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablerow.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablerow.md deleted file mode 100644 index dd0f3f4cb2f60..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.kibanadatatablerow.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [KibanaDatatableRow](./kibana-plugin-plugins-expressions-server.kibanadatatablerow.md) - -## KibanaDatatableRow interface - -Signature: - -```typescript -export interface KibanaDatatableRow -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md index dd7c7af466bd0..9e2189dad2732 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.md @@ -63,10 +63,6 @@ | [Font](./kibana-plugin-plugins-expressions-server.font.md) | An interface representing a font in Canvas, with a textual label and the CSS font-value. | | [IInterpreterRenderHandlers](./kibana-plugin-plugins-expressions-server.iinterpreterrenderhandlers.md) | | | [IRegistry](./kibana-plugin-plugins-expressions-server.iregistry.md) | | -| [KibanaDatatable](./kibana-plugin-plugins-expressions-server.kibanadatatable.md) | | -| [KibanaDatatableColumn](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumn.md) | | -| [KibanaDatatableColumnMeta](./kibana-plugin-plugins-expressions-server.kibanadatatablecolumnmeta.md) | | -| [KibanaDatatableRow](./kibana-plugin-plugins-expressions-server.kibanadatatablerow.md) | | | [PointSeriesColumn](./kibana-plugin-plugins-expressions-server.pointseriescolumn.md) | Column in a PointSeries | | [Range](./kibana-plugin-plugins-expressions-server.range.md) | | | [SerializedDatatable](./kibana-plugin-plugins-expressions-server.serializeddatatable.md) | | @@ -79,7 +75,7 @@ | [AnyExpressionFunctionDefinition](./kibana-plugin-plugins-expressions-server.anyexpressionfunctiondefinition.md) | Type to capture every possible expression function definition. | | [AnyExpressionTypeDefinition](./kibana-plugin-plugins-expressions-server.anyexpressiontypedefinition.md) | | | [ArgumentType](./kibana-plugin-plugins-expressions-server.argumenttype.md) | This type represents all of the possible combinations of properties of an Argument in an Expression Function. The presence or absence of certain fields influence the shape and presence of others within each arg in the specification. | -| [DatatableColumnType](./kibana-plugin-plugins-expressions-server.datatablecolumntype.md) | This type represents the type of any DatatableColumn in a Datatable. | +| [DatatableColumnType](./kibana-plugin-plugins-expressions-server.datatablecolumntype.md) | This type represents the type of any DatatableColumn in a Datatable. its duplicated from KBN\_FIELD\_TYPES | | [DatatableRow](./kibana-plugin-plugins-expressions-server.datatablerow.md) | This type represents a row in a Datatable. | | [ExecutionContainer](./kibana-plugin-plugins-expressions-server.executioncontainer.md) | | | [ExecutorContainer](./kibana-plugin-plugins-expressions-server.executorcontainer.md) | | diff --git a/src/plugins/data/common/search/expressions/esaggs.ts b/src/plugins/data/common/search/expressions/esaggs.ts index 2957512886b4d..4f65babdcd360 100644 --- a/src/plugins/data/common/search/expressions/esaggs.ts +++ b/src/plugins/data/common/search/expressions/esaggs.ts @@ -19,12 +19,12 @@ import { KibanaContext, - KibanaDatatable, + Datatable, ExpressionFunctionDefinition, } from '../../../../../plugins/expressions/common'; type Input = KibanaContext | null; -type Output = Promise; +type Output = Promise; interface Arguments { index: string; diff --git a/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts index aa96d77d873d3..6dcfa4d02bcb2 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts @@ -21,7 +21,12 @@ import moment from 'moment'; import { createFiltersFromRangeSelectAction } from './create_filters_from_range_select'; -import { IndexPatternsContract, RangeFilter } from '../../../public'; +import { + fieldFormats, + FieldFormatsGetConfigFn, + IndexPatternsContract, + RangeFilter, +} from '../../../public'; import { dataPluginMock } from '../../../public/mocks'; import { setIndexPatterns, setSearchService } from '../../../public/services'; import { TriggerContextMapping } from '../../../../ui_actions/public'; @@ -31,23 +36,30 @@ describe('brushEvent', () => { const JAN_01_2014 = 1388559600000; let baseEvent: TriggerContextMapping['SELECT_RANGE_TRIGGER']['data']; + const mockField = { + name: 'time', + indexPattern: { + id: 'logstash-*', + }, + filterable: true, + format: new fieldFormats.DateFormat({}, (() => {}) as FieldFormatsGetConfigFn), + }; + const indexPattern = { id: 'indexPatternId', timeFieldName: 'time', fields: { - getByName: () => undefined, - filter: () => [], + getByName: () => mockField, + filter: () => [mockField], }, }; - const aggConfigs = [ - { - params: { - field: {}, - }, - getIndexPattern: () => indexPattern, + const serializedAggConfig = { + type: 'date_histogram', + params: { + field: {}, }, - ]; + }; beforeEach(() => { const dataStart = dataPluginMock.createStartContract(); @@ -60,15 +72,18 @@ describe('brushEvent', () => { baseEvent = { column: 0, table: { - type: 'kibana_datatable', + type: 'datatable', columns: [ { id: '1', name: '1', meta: { - type: 'histogram', - indexPatternId: 'indexPatternId', - aggConfigParams: aggConfigs[0].params, + type: 'date', + sourceParams: { + indexPatternId: 'indexPatternId', + ...serializedAggConfig, + }, + source: 'esaggs', }, }, ], @@ -90,7 +105,7 @@ describe('brushEvent', () => { describe('handles an event when the x-axis field is a date field', () => { describe('date field is index pattern timefield', () => { beforeEach(() => { - aggConfigs[0].params.field = { + serializedAggConfig.params.field = { name: 'time', type: 'date', }; @@ -98,7 +113,7 @@ describe('brushEvent', () => { afterAll(() => { baseEvent.range = []; - aggConfigs[0].params.field = {}; + serializedAggConfig.params.field = {}; }); test('by ignoring the event when range spans zero time', async () => { @@ -123,7 +138,7 @@ describe('brushEvent', () => { describe('date field is not index pattern timefield', () => { beforeEach(() => { - aggConfigs[0].params.field = { + serializedAggConfig.params.field = { name: 'anotherTimeField', type: 'date', }; @@ -131,7 +146,7 @@ describe('brushEvent', () => { afterAll(() => { baseEvent.range = []; - aggConfigs[0].params.field = {}; + serializedAggConfig.params.field = {}; }); test('creates a new range filter', async () => { @@ -157,7 +172,7 @@ describe('brushEvent', () => { describe('handles an event when the x-axis field is a number', () => { beforeAll(() => { - aggConfigs[0].params.field = { + serializedAggConfig.params.field = { name: 'numberField', type: 'number', }; diff --git a/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts index d9aa1b8ec8048..2d7aeff79a689 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts @@ -20,9 +20,9 @@ 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 type { RangeSelectContext } from '../../../../embeddable/public'; +import { getIndexPatterns, getSearchService } from '../../../public/services'; +import { RangeSelectContext } from '../../../../embeddable/public'; +import { AggConfigSerialized } from '../../../common/search/aggs'; export async function createFiltersFromRangeSelectAction(event: RangeSelectContext['data']) { const column: Record = event.table.columns[event.column]; @@ -31,11 +31,12 @@ export async function createFiltersFromRangeSelectAction(event: RangeSelectConte return []; } - const indexPattern = await getIndexPatterns().get(column.meta.indexPatternId); - const aggConfig = deserializeAggConfig({ - ...column.meta, - indexPattern, - }); + const { indexPatternId, ...aggConfigs } = column.meta.sourceParams; + const indexPattern = await getIndexPatterns().get(indexPatternId); + const aggConfigsInstance = getSearchService().aggs.createAggConfigs(indexPattern, [ + aggConfigs as AggConfigSerialized, + ]); + const aggConfig = aggConfigsInstance.aggs[0]; const field: IFieldType = aggConfig.params.field; if (!field || event.range.length <= 1) { diff --git a/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts index 2ad20c3807819..23d2ab080d75e 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts @@ -45,12 +45,16 @@ describe('createFiltersFromValueClick', () => { name: 'test', id: '1-1', meta: { - type: 'histogram', - indexPatternId: 'logstash-*', - aggConfigParams: { - field: 'bytes', - interval: 30, - otherBucket: true, + type: 'date', + source: 'esaggs', + sourceParams: { + indexPatternId: 'logstash-*', + type: 'histogram', + params: { + field: 'bytes', + interval: 30, + otherBucket: true, + }, }, }, }, @@ -91,9 +95,7 @@ describe('createFiltersFromValueClick', () => { }); test('handles an event when aggregations type is a terms', async () => { - if (dataPoints[0].table.columns[0].meta) { - dataPoints[0].table.columns[0].meta.type = 'terms'; - } + (dataPoints[0].table.columns[0].meta.sourceParams as any).type = 'terms'; const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(1); diff --git a/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts index 9429df91f693c..ce7ecf434056a 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts @@ -17,11 +17,11 @@ * under the License. */ -import { KibanaDatatable } from '../../../../../plugins/expressions/public'; -import { deserializeAggConfig } from '../../search/expressions'; +import { Datatable } from '../../../../../plugins/expressions/public'; import { esFilters, Filter } from '../../../public'; -import { getIndexPatterns } from '../../../public/services'; -import type { ValueClickContext } from '../../../../embeddable/public'; +import { getIndexPatterns, getSearchService } from '../../../public/services'; +import { ValueClickContext } from '../../../../embeddable/public'; +import { AggConfigSerialized } from '../../../common/search/aggs'; /** * For terms aggregations on `__other__` buckets, this assembles a list of applicable filter @@ -33,7 +33,7 @@ import type { ValueClickContext } from '../../../../embeddable/public'; * @return {array} - array of terms to filter against */ const getOtherBucketFilterTerms = ( - table: Pick, + table: Pick, columnIndex: number, rowIndex: number ) => { @@ -71,22 +71,28 @@ const getOtherBucketFilterTerms = ( * @return {Filter[]|undefined} - list of filters to provide to queryFilter.addFilters() */ const createFilter = async ( - table: Pick, + table: Pick, columnIndex: number, rowIndex: number ) => { - if (!table || !table.columns || !table.columns[columnIndex]) { + if ( + !table || + !table.columns || + !table.columns[columnIndex] || + !table.columns[columnIndex].meta || + table.columns[columnIndex].meta.source !== 'esaggs' || + !table.columns[columnIndex].meta.sourceParams?.indexPatternId + ) { return; } const column = table.columns[columnIndex]; - if (!column.meta || !column.meta.indexPatternId) { - return; - } - const aggConfig = deserializeAggConfig({ - type: column.meta.type, - aggConfigParams: column.meta.aggConfigParams ? column.meta.aggConfigParams : {}, - indexPattern: await getIndexPatterns().get(column.meta.indexPatternId), - }); + const { indexPatternId, ...aggConfigParams } = table.columns[columnIndex].meta + .sourceParams as any; + const aggConfigsInstance = getSearchService().aggs.createAggConfigs( + await getIndexPatterns().get(indexPatternId), + [aggConfigParams as AggConfigSerialized] + ); + const aggConfig = aggConfigsInstance.aggs[0]; let filter: Filter[] = []; const value: any = rowIndex > -1 ? table.rows[rowIndex][column.id] : null; if (value === null || value === undefined || !aggConfig.isFilterable()) { diff --git a/src/plugins/data/public/search/expressions/esaggs.ts b/src/plugins/data/public/search/expressions/esaggs.ts index 1021ef0f91d52..a84b95f22e6e8 100644 --- a/src/plugins/data/public/search/expressions/esaggs.ts +++ b/src/plugins/data/public/search/expressions/esaggs.ts @@ -19,7 +19,7 @@ import { get, hasIn } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { KibanaDatatable, KibanaDatatableColumn } from 'src/plugins/expressions/public'; +import { Datatable, DatatableColumn } from 'src/plugins/expressions/public'; import { PersistedState } from '../../../../../plugins/visualizations/public'; import { Adapters } from '../../../../../plugins/inspector/public'; @@ -49,7 +49,6 @@ import { getSearchService, } from '../../services'; import { buildTabularInspectorData } from './build_tabular_inspector_data'; -import { serializeAggConfig } from './utils'; export interface RequestHandlerParams { searchSource: ISearchSource; @@ -193,11 +192,9 @@ const handleCourierRequest = async ({ : undefined, }; - (searchSource as any).tabifiedResponse = tabifyAggResponse( - aggs, - (searchSource as any).finalResponse, - tabifyParams - ); + const response = tabifyAggResponse(aggs, (searchSource as any).finalResponse, tabifyParams); + + (searchSource as any).tabifiedResponse = response; inspectorAdapters.data.setTabularLoader( () => @@ -208,12 +205,12 @@ const handleCourierRequest = async ({ { returnsFormattedValues: true } ); - return (searchSource as any).tabifiedResponse; + return response; }; export const esaggs = (): EsaggsExpressionFunctionDefinition => ({ name, - type: 'kibana_datatable', + type: 'datatable', inputTypes: ['kibana_context', 'null'], help: i18n.translate('data.functions.esaggs.help', { defaultMessage: 'Run AggConfig aggregation', @@ -279,18 +276,25 @@ export const esaggs = (): EsaggsExpressionFunctionDefinition => ({ abortSignal: (abortSignal as unknown) as AbortSignal, }); - const table: KibanaDatatable = { - type: 'kibana_datatable', + const table: Datatable = { + type: 'datatable', rows: response.rows, - columns: response.columns.map((column: any) => { - const cleanedColumn: KibanaDatatableColumn = { + columns: response.columns.map((column) => { + const cleanedColumn: DatatableColumn = { id: column.id, name: column.name, - meta: serializeAggConfig(column.aggConfig), + meta: { + type: column.aggConfig.params.field?.type || 'number', + field: column.aggConfig.params.field?.name, + index: indexPattern.title, + params: column.aggConfig.toSerializedFieldFormat(), + source: 'esaggs', + sourceParams: { + indexPatternId: indexPattern.id, + ...column.aggConfig.serialize(), + }, + }, }; - if (args.includeFormatHints) { - cleanedColumn.formatHint = column.aggConfig.toSerializedFieldFormat(); - } return cleanedColumn; }), }; diff --git a/src/plugins/data/public/search/expressions/index.ts b/src/plugins/data/public/search/expressions/index.ts index 02df7986479ad..98ed1d08af8ad 100644 --- a/src/plugins/data/public/search/expressions/index.ts +++ b/src/plugins/data/public/search/expressions/index.ts @@ -20,4 +20,3 @@ export * from './esaggs'; export * from './es_raw_response'; export * from './esdsl'; -export * from './utils'; diff --git a/src/plugins/data/public/search/expressions/utils/index.ts b/src/plugins/data/public/search/expressions/utils/index.ts deleted file mode 100644 index 094536fc18437..0000000000000 --- a/src/plugins/data/public/search/expressions/utils/index.ts +++ /dev/null @@ -1,20 +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. - */ - -export * from './serialize_agg_config'; diff --git a/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts b/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts deleted file mode 100644 index 6ba323b65783f..0000000000000 --- a/src/plugins/data/public/search/expressions/utils/serialize_agg_config.ts +++ /dev/null @@ -1,54 +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 { KibanaDatatableColumnMeta } from '../../../../../../plugins/expressions/public'; -import { IAggConfig } from '../../../../common'; -import { IndexPattern } from '../../../index_patterns'; -import { getSearchService } from '../../../../public/services'; - -/** @internal */ -export const serializeAggConfig = (aggConfig: IAggConfig): KibanaDatatableColumnMeta => { - return { - type: aggConfig.type.name, - indexPatternId: aggConfig.getIndexPattern().id, - aggConfigParams: aggConfig.serialize().params, - }; -}; - -interface DeserializeAggConfigParams { - type: string; - aggConfigParams: Record; - indexPattern: IndexPattern; -} - -/** @internal */ -export const deserializeAggConfig = ({ - type, - aggConfigParams, - indexPattern, -}: DeserializeAggConfigParams) => { - const { aggs } = getSearchService(); - const aggConfigs = aggs.createAggConfigs(indexPattern); - const aggConfig = aggConfigs.createAggConfig({ - enabled: true, - type, - params: aggConfigParams, - }); - return aggConfig; -}; diff --git a/src/plugins/embeddable/public/lib/triggers/triggers.ts b/src/plugins/embeddable/public/lib/triggers/triggers.ts index ccba5cf771088..54c7a2ecc129d 100644 --- a/src/plugins/embeddable/public/lib/triggers/triggers.ts +++ b/src/plugins/embeddable/public/lib/triggers/triggers.ts @@ -17,7 +17,7 @@ * under the License. */ -import { KibanaDatatable } from '../../../../expressions'; +import { Datatable } from '../../../../expressions'; import { Trigger } from '../../../../ui_actions/public'; import { IEmbeddable } from '..'; @@ -29,7 +29,7 @@ export interface ValueClickContext { embeddable?: T; data: { data: Array<{ - table: Pick; + table: Pick; column: number; row: number; value: any; @@ -42,7 +42,7 @@ export interface ValueClickContext { export interface RangeSelectContext { embeddable?: T; data: { - table: KibanaDatatable; + table: Datatable; column: number; range: number[]; timeFieldName?: string; diff --git a/src/plugins/embeddable/public/public.api.md b/src/plugins/embeddable/public/public.api.md index 6280d3a2e4a50..a6d90f2766c18 100644 --- a/src/plugins/embeddable/public/public.api.md +++ b/src/plugins/embeddable/public/public.api.md @@ -326,7 +326,7 @@ export abstract class Embeddable { +export class EmbeddableChildPanel extends React.Component { constructor(props: EmbeddableChildPanelProps); // (undocumented) [panel: string]: any; @@ -477,7 +477,7 @@ export interface EmbeddablePackageState { // Warning: (ae-missing-release-tag) "EmbeddablePanel" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export class EmbeddablePanel extends React.Component { +export class EmbeddablePanel extends React.Component { constructor(props: Props); // (undocumented) closeMyContextMenuPanel: () => void; @@ -810,7 +810,7 @@ export interface PropertySpec { export interface RangeSelectContext { // (undocumented) data: { - table: KibanaDatatable; + table: Datatable; column: number; range: number[]; timeFieldName?: string; @@ -841,7 +841,7 @@ export interface ValueClickContext { // (undocumented) data: { data: Array<{ - table: Pick; + table: Pick; column: number; row: number; value: any; @@ -881,7 +881,7 @@ export const withEmbeddableSubscription: /** * This type represents the `type` of any `DatatableColumn` in a `Datatable`. + * its duplicated from KBN_FIELD_TYPES */ -export type DatatableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'null'; +export type DatatableColumnType = + | '_source' + | 'attachment' + | 'boolean' + | 'date' + | 'geo_point' + | 'geo_shape' + | 'ip' + | 'murmur3' + | 'number' + | 'string' + | 'unknown' + | 'conflict' + | 'object' + | 'nested' + | 'histogram' + | 'null'; /** * This type represents a row in a `Datatable`. */ export type DatatableRow = Record; +/** + * Datatable column meta information + */ export interface DatatableColumnMeta { type: DatatableColumnType; + /** + * field this column is based on + */ field?: string; + /** + * index/table this column is based on + */ index?: string; - params?: SerializableState; + /** + * serialized field format + */ + params?: SerializedFieldFormat; + /** + * source function that produced this column + */ source?: string; + /** + * any extra parameters for the source that produced this column + */ sourceParams?: SerializableState; } + /** * This type represents the shape of a column in a `Datatable`. */ diff --git a/src/plugins/expressions/common/expression_types/specs/index.ts b/src/plugins/expressions/common/expression_types/specs/index.ts index 31210b11f6b7a..00c52a2545cd6 100644 --- a/src/plugins/expressions/common/expression_types/specs/index.ts +++ b/src/plugins/expressions/common/expression_types/specs/index.ts @@ -23,7 +23,6 @@ import { error } from './error'; import { filter } from './filter'; import { image } from './image'; import { kibanaContext } from './kibana_context'; -import { kibanaDatatable } from './kibana_datatable'; import { nullType } from './null'; import { num } from './num'; import { number } from './number'; @@ -42,7 +41,6 @@ export const typeSpecs: AnyExpressionTypeDefinition[] = [ filter, image, kibanaContext, - kibanaDatatable, nullType, num, number, @@ -60,7 +58,6 @@ export * from './error'; export * from './filter'; export * from './image'; export * from './kibana_context'; -export * from './kibana_datatable'; export * from './null'; export * from './num'; export * from './number'; diff --git a/src/plugins/expressions/common/expression_types/specs/kibana_datatable.ts b/src/plugins/expressions/common/expression_types/specs/kibana_datatable.ts deleted file mode 100644 index e226f3b124eed..0000000000000 --- a/src/plugins/expressions/common/expression_types/specs/kibana_datatable.ts +++ /dev/null @@ -1,75 +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 { map } from 'lodash'; -import { SerializedFieldFormat } from '../../types/common'; -import { Datatable, PointSeries, PointSeriesColumn } from '.'; - -const name = 'kibana_datatable'; - -export interface KibanaDatatableColumnMeta { - type: string; - indexPatternId?: string; - aggConfigParams?: Record; -} - -export interface KibanaDatatableColumn { - id: string; - name: string; - meta?: KibanaDatatableColumnMeta; - formatHint?: SerializedFieldFormat; -} - -export interface KibanaDatatableRow { - [key: string]: unknown; -} - -export interface KibanaDatatable { - type: typeof name; - columns: KibanaDatatableColumn[]; - rows: KibanaDatatableRow[]; -} - -export const kibanaDatatable = { - name, - from: { - datatable: (context: Datatable) => { - return { - type: name, - rows: context.rows, - columns: context.columns.map((column) => { - return { - id: column.name, - name: column.name, - }; - }), - }; - }, - pointseries: (context: PointSeries) => { - const columns = map(context.columns, (column: PointSeriesColumn, n) => { - return { id: n, name: n, ...column }; - }); - return { - type: name, - rows: context.rows, - columns, - }; - }, - }, -}; diff --git a/src/plugins/expressions/public/index.ts b/src/plugins/expressions/public/index.ts index 039890c9233cf..893d68238747d 100644 --- a/src/plugins/expressions/public/index.ts +++ b/src/plugins/expressions/public/index.ts @@ -98,10 +98,6 @@ export { isExpressionAstBuilder, KIBANA_CONTEXT_NAME, KibanaContext, - KibanaDatatable, - KibanaDatatableColumn, - KibanaDatatableColumnMeta, - KibanaDatatableRow, KnownTypeToString, Overflow, parse, diff --git a/src/plugins/expressions/public/public.api.md b/src/plugins/expressions/public/public.api.md index 57ad6f747e5af..b1a7a4040964e 100644 --- a/src/plugins/expressions/public/public.api.md +++ b/src/plugins/expressions/public/public.api.md @@ -82,7 +82,7 @@ export interface DatatableColumn { // Warning: (ae-missing-release-tag) "DatatableColumnType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export type DatatableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'null'; +export type DatatableColumnType = '_source' | 'attachment' | 'boolean' | 'date' | 'geo_point' | 'geo_shape' | 'ip' | 'murmur3' | 'number' | 'string' | 'unknown' | 'conflict' | 'object' | 'nested' | 'histogram' | 'null'; // Warning: (ae-missing-release-tag) "DatatableRow" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -942,54 +942,6 @@ export type KIBANA_CONTEXT_NAME = 'kibana_context'; // @public (undocumented) export type KibanaContext = ExpressionValueSearchContext; -// Warning: (ae-missing-release-tag) "KibanaDatatable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatable { - // (undocumented) - columns: KibanaDatatableColumn[]; - // (undocumented) - rows: KibanaDatatableRow[]; - // Warning: (ae-forgotten-export) The symbol "name" needs to be exported by the entry point index.d.ts - // - // (undocumented) - type: typeof name_3; -} - -// Warning: (ae-missing-release-tag) "KibanaDatatableColumn" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatableColumn { - // (undocumented) - formatHint?: SerializedFieldFormat; - // (undocumented) - id: string; - // (undocumented) - meta?: KibanaDatatableColumnMeta; - // (undocumented) - name: string; -} - -// Warning: (ae-missing-release-tag) "KibanaDatatableColumnMeta" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatableColumnMeta { - // (undocumented) - aggConfigParams?: Record; - // (undocumented) - indexPatternId?: string; - // (undocumented) - type: string; -} - -// Warning: (ae-missing-release-tag) "KibanaDatatableRow" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatableRow { - // (undocumented) - [key: string]: unknown; -} - // Warning: (ae-missing-release-tag) "KnownTypeToString" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -1073,7 +1025,7 @@ export interface Range { // Warning: (ae-forgotten-export) The symbol "name" needs to be exported by the entry point index.d.ts // // (undocumented) - type: typeof name_4; + type: typeof name_3; } // Warning: (ae-missing-release-tag) "ReactExpressionRenderer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/src/plugins/expressions/server/index.ts b/src/plugins/expressions/server/index.ts index 6785457321595..cc22d4b500d97 100644 --- a/src/plugins/expressions/server/index.ts +++ b/src/plugins/expressions/server/index.ts @@ -89,10 +89,6 @@ export { isExpressionAstBuilder, KIBANA_CONTEXT_NAME, KibanaContext, - KibanaDatatable, - KibanaDatatableColumn, - KibanaDatatableColumnMeta, - KibanaDatatableRow, KnownTypeToString, Overflow, parse, diff --git a/src/plugins/expressions/server/server.api.md b/src/plugins/expressions/server/server.api.md index 1a905de4a3bdf..e151d1bb58a61 100644 --- a/src/plugins/expressions/server/server.api.md +++ b/src/plugins/expressions/server/server.api.md @@ -79,7 +79,7 @@ export interface DatatableColumn { // Warning: (ae-missing-release-tag) "DatatableColumnType" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export type DatatableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'null'; +export type DatatableColumnType = '_source' | 'attachment' | 'boolean' | 'date' | 'geo_point' | 'geo_shape' | 'ip' | 'murmur3' | 'number' | 'string' | 'unknown' | 'conflict' | 'object' | 'nested' | 'histogram' | 'null'; // Warning: (ae-missing-release-tag) "DatatableRow" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -768,54 +768,6 @@ export type KIBANA_CONTEXT_NAME = 'kibana_context'; // @public (undocumented) export type KibanaContext = ExpressionValueSearchContext; -// Warning: (ae-missing-release-tag) "KibanaDatatable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatable { - // (undocumented) - columns: KibanaDatatableColumn[]; - // (undocumented) - rows: KibanaDatatableRow[]; - // Warning: (ae-forgotten-export) The symbol "name" needs to be exported by the entry point index.d.ts - // - // (undocumented) - type: typeof name_3; -} - -// Warning: (ae-missing-release-tag) "KibanaDatatableColumn" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatableColumn { - // (undocumented) - formatHint?: SerializedFieldFormat; - // (undocumented) - id: string; - // (undocumented) - meta?: KibanaDatatableColumnMeta; - // (undocumented) - name: string; -} - -// Warning: (ae-missing-release-tag) "KibanaDatatableColumnMeta" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatableColumnMeta { - // (undocumented) - aggConfigParams?: Record; - // (undocumented) - indexPatternId?: string; - // (undocumented) - type: string; -} - -// Warning: (ae-missing-release-tag) "KibanaDatatableRow" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KibanaDatatableRow { - // (undocumented) - [key: string]: unknown; -} - // Warning: (ae-missing-release-tag) "KnownTypeToString" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public @@ -898,7 +850,7 @@ export interface Range { // Warning: (ae-forgotten-export) The symbol "name" needs to be exported by the entry point index.d.ts // // (undocumented) - type: typeof name_4; + type: typeof name_3; } // Warning: (ae-missing-release-tag) "SerializedDatatable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/src/plugins/input_control_vis/public/input_control_fn.ts b/src/plugins/input_control_vis/public/input_control_fn.ts index 59c0e03505bb7..1664555b916b6 100644 --- a/src/plugins/input_control_vis/public/input_control_fn.ts +++ b/src/plugins/input_control_vis/public/input_control_fn.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; -import { ExpressionFunctionDefinition, KibanaDatatable, Render } from '../../expressions/public'; +import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; interface Arguments { visConfig: string; @@ -34,7 +34,7 @@ interface RenderValue { export const createInputControlVisFn = (): ExpressionFunctionDefinition< 'input_control_vis', - KibanaDatatable, + Datatable, Arguments, Render > => ({ diff --git a/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap b/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap index 2d615a105906c..cb12712ae824f 100644 --- a/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap +++ b/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap @@ -50,7 +50,7 @@ Object { "col-0-1": 0, }, ], - "type": "kibana_datatable", + "type": "datatable", }, "visType": "region_map", }, diff --git a/src/plugins/region_map/public/region_map_fn.js b/src/plugins/region_map/public/region_map_fn.js index 314def1fbfdca..fdb7c273720fa 100644 --- a/src/plugins/region_map/public/region_map_fn.js +++ b/src/plugins/region_map/public/region_map_fn.js @@ -23,7 +23,7 @@ export const createRegionMapFn = () => ({ name: 'regionmap', type: 'render', context: { - types: ['kibana_datatable'], + types: ['datatable'], }, help: i18n.translate('regionMap.function.help', { defaultMessage: 'Regionmap visualization', diff --git a/src/plugins/region_map/public/region_map_fn.test.js b/src/plugins/region_map/public/region_map_fn.test.js index 684cc5e897df4..32467541dee02 100644 --- a/src/plugins/region_map/public/region_map_fn.test.js +++ b/src/plugins/region_map/public/region_map_fn.test.js @@ -24,7 +24,7 @@ import { createRegionMapFn } from './region_map_fn'; describe('interpreter/functions#regionmap', () => { const fn = functionWrapper(createRegionMapFn()); const context = { - type: 'kibana_datatable', + type: 'datatable', rows: [{ 'col-0-1': 0 }], columns: [{ id: 'col-0-1', name: 'Count' }], }; diff --git a/src/plugins/tile_map/public/tile_map_fn.js b/src/plugins/tile_map/public/tile_map_fn.js index 5f43077bcb24b..3253598d98d94 100644 --- a/src/plugins/tile_map/public/tile_map_fn.js +++ b/src/plugins/tile_map/public/tile_map_fn.js @@ -23,7 +23,7 @@ export const createTileMapFn = () => ({ name: 'tilemap', type: 'render', context: { - types: ['kibana_datatable'], + types: ['datatable'], }, help: i18n.translate('tileMap.function.help', { defaultMessage: 'Tilemap visualization', diff --git a/src/plugins/tile_map/public/tile_map_visualization.js b/src/plugins/tile_map/public/tile_map_visualization.js index b09a2f3bac48f..80084be283658 100644 --- a/src/plugins/tile_map/public/tile_map_visualization.js +++ b/src/plugins/tile_map/public/tile_map_visualization.js @@ -73,19 +73,19 @@ export const createTileMapVisualization = (dependencies) => { }; const bounds = this._kibanaMap.getBounds(); const mapCollar = scaleBounds(bounds); - if (!geoContains(geohashAgg.aggConfigParams.boundingBox, mapCollar)) { + if (!geoContains(geohashAgg.sourceParams.params.boundingBox, mapCollar)) { updateVarsObject.data.boundingBox = { top_left: mapCollar.top_left, bottom_right: mapCollar.bottom_right, }; } else { - updateVarsObject.data.boundingBox = geohashAgg.aggConfigParams.boundingBox; + updateVarsObject.data.boundingBox = geohashAgg.sourceParams.params.boundingBox; } // todo: autoPrecision should be vis parameter, not aggConfig one const zoomPrecision = getZoomPrecision(); - updateVarsObject.data.precision = geohashAgg.aggConfigParams.autoPrecision + updateVarsObject.data.precision = geohashAgg.sourceParams.params.autoPrecision ? zoomPrecision[this.vis.getUiState().get('mapZoom')] - : getPrecision(geohashAgg.aggConfigParams.precision); + : getPrecision(geohashAgg.sourceParams.params.precision); this.vis.eventsSubject.next(updateVarsObject); }; @@ -118,8 +118,8 @@ export const createTileMapVisualization = (dependencies) => { return; } const isAutoPrecision = - typeof geohashAgg.aggConfigParams.autoPrecision === 'boolean' - ? geohashAgg.aggConfigParams.autoPrecision + typeof geohashAgg.sourceParams.params.autoPrecision === 'boolean' + ? geohashAgg.sourceParams.params.autoPrecision : true; if (!isAutoPrecision) { return; @@ -243,7 +243,7 @@ export const createTileMapVisualization = (dependencies) => { } const indexPatternName = agg.indexPatternId; - const field = agg.aggConfigParams.field; + const field = agg.field; const filter = { meta: { negate: false, index: indexPatternName } }; filter[filterName] = { ignore_unmapped: true }; filter[filterName][field] = filterData; @@ -264,7 +264,7 @@ export const createTileMapVisualization = (dependencies) => { const DEFAULT = false; const agg = this._getGeoHashAgg(); if (agg) { - return get(agg, 'aggConfigParams.isFilteredByCollar', DEFAULT); + return get(agg, 'sourceParams.params.isFilteredByCollar', DEFAULT); } else { return DEFAULT; } diff --git a/src/plugins/tile_map/public/tilemap_fn.test.js b/src/plugins/tile_map/public/tilemap_fn.test.js index 8fa12c9f9dbbe..df9fc10a7303c 100644 --- a/src/plugins/tile_map/public/tilemap_fn.test.js +++ b/src/plugins/tile_map/public/tilemap_fn.test.js @@ -41,7 +41,7 @@ import { convertToGeoJson } from '../../maps_legacy/public'; describe('interpreter/functions#tilemap', () => { const fn = functionWrapper(createTileMapFn()); const context = { - type: 'kibana_datatable', + type: 'datatable', rows: [{ 'col-0-1': 0 }], columns: [{ id: 'col-0-1', name: 'Count' }], }; diff --git a/src/plugins/vis_type_markdown/public/markdown_renderer.tsx b/src/plugins/vis_type_markdown/public/markdown_renderer.tsx index 8071196c6a213..f36ffadff7c56 100644 --- a/src/plugins/vis_type_markdown/public/markdown_renderer.tsx +++ b/src/plugins/vis_type_markdown/public/markdown_renderer.tsx @@ -36,7 +36,7 @@ export const markdownVisRenderer: ExpressionRenderDefinition + , domNode diff --git a/src/plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap b/src/plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap index 706d2a902aa90..fd8f3a712d8ae 100644 --- a/src/plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap +++ b/src/plugins/vis_type_metric/public/__snapshots__/metric_vis_fn.test.ts.snap @@ -43,7 +43,7 @@ Object { "col-0-1": 0, }, ], - "type": "kibana_datatable", + "type": "datatable", }, "visType": "metric", }, diff --git a/src/plugins/vis_type_metric/public/components/metric_vis_component.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_component.tsx index e5c7db65c09a8..5ab3ee6eed8eb 100644 --- a/src/plugins/vis_type_metric/public/components/metric_vis_component.tsx +++ b/src/plugins/vis_type_metric/public/components/metric_vis_component.tsx @@ -23,7 +23,7 @@ import { isColorDark } from '@elastic/eui'; import { MetricVisValue } from './metric_vis_value'; import { Input } from '../metric_vis_fn'; import { FieldFormatsContentType, IFieldFormat } from '../../../data/public'; -import { KibanaDatatable } from '../../../expressions/public'; +import { Datatable } from '../../../expressions/public'; import { getHeatmapColors } from '../../../charts/public'; import { VisParams, MetricVisMetric } from '../types'; import { getFormatService } from '../services'; @@ -109,7 +109,7 @@ class MetricVisComponent extends Component { return fieldFormatter.convert(value, format); }; - private processTableGroups(table: KibanaDatatable) { + private processTableGroups(table: Datatable) { const config = this.props.visParams.metric; const dimensions = this.props.visParams.dimensions; const isPercentageMode = config.percentageMode; diff --git a/src/plugins/vis_type_metric/public/metric_vis_fn.test.ts b/src/plugins/vis_type_metric/public/metric_vis_fn.test.ts index 3ed8f8f79a83f..8faa3d2aab265 100644 --- a/src/plugins/vis_type_metric/public/metric_vis_fn.test.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_fn.test.ts @@ -23,7 +23,7 @@ import { functionWrapper } from '../../expressions/common/expression_functions/s describe('interpreter/functions#metric', () => { const fn = functionWrapper(createMetricVisFn()); const context = { - type: 'kibana_datatable', + type: 'datatable', rows: [{ 'col-0-1': 0 }], columns: [{ id: 'col-0-1', name: 'Count' }], }; diff --git a/src/plugins/vis_type_metric/public/metric_vis_fn.ts b/src/plugins/vis_type_metric/public/metric_vis_fn.ts index 97b1e6822333e..20de22f50e63a 100644 --- a/src/plugins/vis_type_metric/public/metric_vis_fn.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_fn.ts @@ -21,7 +21,7 @@ import { i18n } from '@kbn/i18n'; import { ExpressionFunctionDefinition, - KibanaDatatable, + Datatable, Range, Render, Style, @@ -29,7 +29,7 @@ import { import { visType, DimensionsVisParam, VisParams } from './types'; import { ColorSchemas, vislibColorMaps, ColorModes } from '../../charts/public'; -export type Input = KibanaDatatable; +export type Input = Datatable; interface Arguments { percentageMode: boolean; @@ -63,7 +63,7 @@ export type MetricVisExpressionFunctionDefinition = ExpressionFunctionDefinition export const createMetricVisFn = (): MetricVisExpressionFunctionDefinition => ({ name: 'metricVis', type: 'render', - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], help: i18n.translate('visTypeMetric.function.help', { defaultMessage: 'Metric visualization', }), diff --git a/src/plugins/vis_type_metric/public/metric_vis_renderer.tsx b/src/plugins/vis_type_metric/public/metric_vis_renderer.tsx index bf0d6da9fba05..8e0cb35ca52aa 100644 --- a/src/plugins/vis_type_metric/public/metric_vis_renderer.tsx +++ b/src/plugins/vis_type_metric/public/metric_vis_renderer.tsx @@ -36,7 +36,11 @@ export const metricVisRenderer: () => ExpressionRenderDefinition + ({ describe('interpreter/functions#table', () => { const fn = functionWrapper(createTableVisFn()); const context = { - type: 'kibana_datatable', + type: 'datatable', rows: [{ 'col-0-1': 0 }], columns: [{ id: 'col-0-1', name: 'Count' }], }; diff --git a/src/plugins/vis_type_table/public/table_vis_fn.ts b/src/plugins/vis_type_table/public/table_vis_fn.ts index 2e446ba4e4fcf..28990f28caf31 100644 --- a/src/plugins/vis_type_table/public/table_vis_fn.ts +++ b/src/plugins/vis_type_table/public/table_vis_fn.ts @@ -19,10 +19,10 @@ import { i18n } from '@kbn/i18n'; import { tableVisResponseHandler, TableContext } from './table_vis_response_handler'; -import { ExpressionFunctionDefinition, KibanaDatatable, Render } from '../../expressions/public'; +import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; import { TableVisConfig } from './types'; -export type Input = KibanaDatatable; +export type Input = Datatable; interface Arguments { visConfig: string | null; @@ -44,7 +44,7 @@ export type TableExpressionFunctionDefinition = ExpressionFunctionDefinition< export const createTableVisFn = (): TableExpressionFunctionDefinition => ({ name: 'kibana_table', type: 'render', - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], help: i18n.translate('visTypeTable.function.help', { defaultMessage: 'Table visualization', }), diff --git a/src/plugins/vis_type_tagcloud/public/__snapshots__/tag_cloud_fn.test.ts.snap b/src/plugins/vis_type_tagcloud/public/__snapshots__/tag_cloud_fn.test.ts.snap index debc7ab27c632..17a91a4d43cc7 100644 --- a/src/plugins/vis_type_tagcloud/public/__snapshots__/tag_cloud_fn.test.ts.snap +++ b/src/plugins/vis_type_tagcloud/public/__snapshots__/tag_cloud_fn.test.ts.snap @@ -17,7 +17,7 @@ Object { "col-0-1": 0, }, ], - "type": "kibana_datatable", + "type": "datatable", }, "visParams": Object { "maxFontSize": 72, diff --git a/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.test.ts b/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.test.ts index eb16b0855a138..e481c311d5453 100644 --- a/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.test.ts +++ b/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.test.ts @@ -24,7 +24,7 @@ import { functionWrapper } from '../../expressions/common/expression_functions/s describe('interpreter/functions#tagcloud', () => { const fn = functionWrapper(createTagCloudFn()); const context = { - type: 'kibana_datatable', + type: 'datatable', rows: [{ 'col-0-1': 0 }], columns: [{ id: 'col-0-1', name: 'Count' }], }; diff --git a/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.ts b/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.ts index 42e126908c00f..ff59572e0817d 100644 --- a/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.ts +++ b/src/plugins/vis_type_tagcloud/public/tag_cloud_fn.ts @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; -import { ExpressionFunctionDefinition, KibanaDatatable, Render } from '../../expressions/public'; +import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; import { TagCloudVisParams } from './types'; const name = 'tagcloud'; @@ -31,13 +31,13 @@ interface Arguments extends TagCloudVisParams { export interface TagCloudVisRenderValue { visType: typeof name; - visData: KibanaDatatable; + visData: Datatable; visParams: Arguments; } export type TagcloudExpressionFunctionDefinition = ExpressionFunctionDefinition< typeof name, - KibanaDatatable, + Datatable, Arguments, Render >; @@ -45,7 +45,7 @@ export type TagcloudExpressionFunctionDefinition = ExpressionFunctionDefinition< export const createTagCloudFn = (): TagcloudExpressionFunctionDefinition => ({ name, type: 'render', - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], help: i18n.translate('visTypeTagCloud.function.help', { defaultMessage: 'Tagcloud visualization', }), diff --git a/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx b/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx index b433ed9cbed21..21194189745aa 100644 --- a/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx +++ b/src/plugins/vis_type_tagcloud/public/tag_cloud_vis_renderer.tsx @@ -39,7 +39,7 @@ export const getTagCloudVisRenderer: ( }); render( - + + ({ describe('interpreter/functions#pie', () => { const fn = functionWrapper(createPieVisFn()); const context = { - type: 'kibana_datatable', + type: 'datatable', rows: [{ 'col-0-1': 0 }], columns: [{ id: 'col-0-1', name: 'Count' }], }; diff --git a/src/plugins/vis_type_vislib/public/pie_fn.ts b/src/plugins/vis_type_vislib/public/pie_fn.ts index 52da0f7ac14ec..bee200cbe30ee 100644 --- a/src/plugins/vis_type_vislib/public/pie_fn.ts +++ b/src/plugins/vis_type_vislib/public/pie_fn.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { ExpressionFunctionDefinition, KibanaDatatable, Render } from '../../expressions/public'; +import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; // @ts-ignore import { vislibSlicesResponseHandler } from './vislib/response_handler'; @@ -34,13 +34,13 @@ interface RenderValue { export const createPieVisFn = (): ExpressionFunctionDefinition< 'kibana_pie', - KibanaDatatable, + Datatable, Arguments, Render > => ({ name: 'kibana_pie', type: 'render', - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], help: i18n.translate('visTypeVislib.functions.pie.help', { defaultMessage: 'Pie visualization', }), diff --git a/src/plugins/vis_type_vislib/public/vis_type_vislib_vis_fn.ts b/src/plugins/vis_type_vislib/public/vis_type_vislib_vis_fn.ts index a4243c6d25c41..557f9930f55b1 100644 --- a/src/plugins/vis_type_vislib/public/vis_type_vislib_vis_fn.ts +++ b/src/plugins/vis_type_vislib/public/vis_type_vislib_vis_fn.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { ExpressionFunctionDefinition, KibanaDatatable, Render } from '../../expressions/public'; +import { ExpressionFunctionDefinition, Datatable, Render } from '../../expressions/public'; // @ts-ignore import { vislibSeriesResponseHandler } from './vislib/response_handler'; @@ -36,13 +36,13 @@ interface RenderValue { export const createVisTypeVislibVisFn = (): ExpressionFunctionDefinition< 'vislib', - KibanaDatatable, + Datatable, Arguments, Render > => ({ name: 'vislib', type: 'render', - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], help: i18n.translate('visTypeVislib.functions.vislib.help', { defaultMessage: 'Vislib visualization', }), diff --git a/src/plugins/visualizations/public/components/visualization_container.tsx b/src/plugins/visualizations/public/components/visualization_container.tsx index 007a9e6e9dde4..5695a84269bd4 100644 --- a/src/plugins/visualizations/public/components/visualization_container.tsx +++ b/src/plugins/visualizations/public/components/visualization_container.tsx @@ -21,16 +21,19 @@ import React, { ReactNode, Suspense } from 'react'; import { EuiLoadingChart } from '@elastic/eui'; import classNames from 'classnames'; import { VisualizationNoResults } from './visualization_noresults'; +import { IInterpreterRenderHandlers } from '../../../expressions/common'; interface VisualizationContainerProps { className?: string; children: ReactNode; + handlers: IInterpreterRenderHandlers; showNoResult?: boolean; } export const VisualizationContainer = ({ className, children, + handlers, showNoResult = false, }: VisualizationContainerProps) => { const classes = classNames('visualization', className); @@ -44,7 +47,7 @@ export const VisualizationContainer = ({ return (
- {showNoResult ? : children} + {showNoResult ? handlers.done()} /> : children}
); diff --git a/src/plugins/visualizations/public/expression_functions/range.ts b/src/plugins/visualizations/public/expression_functions/range.ts index 42eb6aa781970..409199deb8181 100644 --- a/src/plugins/visualizations/public/expression_functions/range.ts +++ b/src/plugins/visualizations/public/expression_functions/range.ts @@ -18,7 +18,7 @@ */ import { i18n } from '@kbn/i18n'; -import { ExpressionFunctionDefinition, KibanaDatatable, Range } from '../../../expressions/public'; +import { ExpressionFunctionDefinition, Datatable, Range } from '../../../expressions/public'; interface Arguments { from: number; @@ -27,7 +27,7 @@ interface Arguments { export const range = (): ExpressionFunctionDefinition< 'range', - KibanaDatatable | null, + Datatable | null, Arguments, Range > => ({ diff --git a/src/plugins/visualizations/public/expression_functions/vis_dimension.ts b/src/plugins/visualizations/public/expression_functions/vis_dimension.ts index 286804d2fa76a..a78634b7eef14 100644 --- a/src/plugins/visualizations/public/expression_functions/vis_dimension.ts +++ b/src/plugins/visualizations/public/expression_functions/vis_dimension.ts @@ -21,8 +21,8 @@ import { i18n } from '@kbn/i18n'; import { ExpressionFunctionDefinition, ExpressionValueBoxed, - KibanaDatatable, - KibanaDatatableColumn, + Datatable, + DatatableColumn, } from '../../../expressions/public'; interface Arguments { @@ -34,7 +34,7 @@ interface Arguments { type ExpressionValueVisDimension = ExpressionValueBoxed< 'vis_dimension', { - accessor: number | KibanaDatatableColumn; + accessor: number | DatatableColumn; format: { id?: string; params: unknown; @@ -44,7 +44,7 @@ type ExpressionValueVisDimension = ExpressionValueBoxed< export const visDimension = (): ExpressionFunctionDefinition< 'visdimension', - KibanaDatatable, + Datatable, Arguments, ExpressionValueVisDimension > => ({ @@ -53,7 +53,7 @@ export const visDimension = (): ExpressionFunctionDefinition< defaultMessage: 'Generates visConfig dimension object', }), type: 'vis_dimension', - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], args: { accessor: { types: ['string', 'number'], diff --git a/test/interpreter_functional/snapshots/baseline/combined_test2.json b/test/interpreter_functional/snapshots/baseline/combined_test2.json index 84203617ff853..3ed4441e7896f 100644 --- a/test/interpreter_functional/snapshots/baseline/combined_test2.json +++ b/test/interpreter_functional/snapshots/baseline/combined_test2.json @@ -1 +1 @@ -{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"} \ No newline at end of file +{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/combined_test3.json b/test/interpreter_functional/snapshots/baseline/combined_test3.json index 2760875119197..f4d03ee7ffc15 100644 --- a/test/interpreter_functional/snapshots/baseline/combined_test3.json +++ b/test/interpreter_functional/snapshots/baseline/combined_test3.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/final_output_test.json b/test/interpreter_functional/snapshots/baseline/final_output_test.json index 2760875119197..f4d03ee7ffc15 100644 --- a/test/interpreter_functional/snapshots/baseline/final_output_test.json +++ b/test/interpreter_functional/snapshots/baseline/final_output_test.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_all_data.json b/test/interpreter_functional/snapshots/baseline/metric_all_data.json index ae72bcfa6d5ec..b31efb0934860 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_all_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_all_data.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_invalid_data.json b/test/interpreter_functional/snapshots/baseline/metric_invalid_data.json index fa5892190e5ba..0a47cdb8ff74a 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_invalid_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_invalid_data.json @@ -1 +1 @@ -"[metricVis] > [visdimension] > Can not cast 'null' to any of 'kibana_datatable'" \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json b/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json index 8568215fd9e1a..3c2d7102554bf 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_multi_metric_data.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json b/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json index d11e1dfb925f1..7c1ebb186d1d5 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json +++ b/test/interpreter_functional/snapshots/baseline/metric_percentage_mode.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":1000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":true,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":1000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":true,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json b/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json index b160e05935f17..9bb09ddfd959a 100644 --- a/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/metric_single_metric_data.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_1.json b/test/interpreter_functional/snapshots/baseline/partial_test_1.json index 9c642e5e266d0..829db0e190822 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_1.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_1.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_2.json b/test/interpreter_functional/snapshots/baseline/partial_test_2.json index 2760875119197..f4d03ee7ffc15 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_2.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_2.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/partial_test_3.json b/test/interpreter_functional/snapshots/baseline/partial_test_3.json index 4241d6f208bfd..821b42aea81ee 100644 --- a/test/interpreter_functional/snapshots/baseline/partial_test_3.json +++ b/test/interpreter_functional/snapshots/baseline/partial_test_3.json @@ -1 +1 @@ -{"as":"visualization","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"region_map"}} \ No newline at end of file +{"as":"visualization","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/step_output_test2.json b/test/interpreter_functional/snapshots/baseline/step_output_test2.json index 84203617ff853..3ed4441e7896f 100644 --- a/test/interpreter_functional/snapshots/baseline/step_output_test2.json +++ b/test/interpreter_functional/snapshots/baseline/step_output_test2.json @@ -1 +1 @@ -{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"} \ No newline at end of file +{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/step_output_test3.json b/test/interpreter_functional/snapshots/baseline/step_output_test3.json index 2760875119197..f4d03ee7ffc15 100644 --- a/test/interpreter_functional/snapshots/baseline/step_output_test3.json +++ b/test/interpreter_functional/snapshots/baseline/step_output_test3.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json b/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json index 153eea71dd8d1..935f0265f50f7 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_all_data.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json b/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json index d5f01afa468ab..f404d63d7f83d 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_fontsize.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":40,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":20,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":40,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":20,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_invalid_data.json b/test/interpreter_functional/snapshots/baseline/tagcloud_invalid_data.json index 46b52a7b3eaae..0c50947beca97 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_invalid_data.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_invalid_data.json @@ -1 +1 @@ -"[tagcloud] > [visdimension] > Can not cast 'null' to any of 'kibana_datatable'" \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visParams":{"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json b/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json index 72b5e957c19a5..90c31ff410ab9 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_metric_data.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/baseline/tagcloud_options.json b/test/interpreter_functional/snapshots/baseline/tagcloud_options.json index 7cbe7cc79882f..4e2dd3be02d90 100644 --- a/test/interpreter_functional/snapshots/baseline/tagcloud_options.json +++ b/test/interpreter_functional/snapshots/baseline/tagcloud_options.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"multiple","scale":"log","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:6121","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"multiple","scale":"log","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/combined_test2.json b/test/interpreter_functional/snapshots/session/combined_test2.json index 84203617ff853..697ebde0fedd9 100644 --- a/test/interpreter_functional/snapshots/session/combined_test2.json +++ b/test/interpreter_functional/snapshots/session/combined_test2.json @@ -1 +1 @@ -{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"} \ No newline at end of file +{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/combined_test3.json b/test/interpreter_functional/snapshots/session/combined_test3.json index 2760875119197..622e4f3543884 100644 --- a/test/interpreter_functional/snapshots/session/combined_test3.json +++ b/test/interpreter_functional/snapshots/session/combined_test3.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/final_output_test.json b/test/interpreter_functional/snapshots/session/final_output_test.json index 2760875119197..622e4f3543884 100644 --- a/test/interpreter_functional/snapshots/session/final_output_test.json +++ b/test/interpreter_functional/snapshots/session/final_output_test.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_all_data.json b/test/interpreter_functional/snapshots/session/metric_all_data.json index ae72bcfa6d5ec..5795a6acb2032 100644 --- a/test/interpreter_functional/snapshots/session/metric_all_data.json +++ b/test/interpreter_functional/snapshots/session/metric_all_data.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":2,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_invalid_data.json b/test/interpreter_functional/snapshots/session/metric_invalid_data.json index fa5892190e5ba..0a47cdb8ff74a 100644 --- a/test/interpreter_functional/snapshots/session/metric_invalid_data.json +++ b/test/interpreter_functional/snapshots/session/metric_invalid_data.json @@ -1 +1 @@ -"[metricVis] > [visdimension] > Can not cast 'null' to any of 'kibana_datatable'" \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json b/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json index 8568215fd9e1a..1f47b8a0cb380 100644 --- a/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json +++ b/test/interpreter_functional/snapshots/session/metric_multi_metric_data.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_percentage_mode.json b/test/interpreter_functional/snapshots/session/metric_percentage_mode.json index d11e1dfb925f1..b18ed9aa8ae72 100644 --- a/test/interpreter_functional/snapshots/session/metric_percentage_mode.json +++ b/test/interpreter_functional/snapshots/session/metric_percentage_mode.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":1000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":true,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":1000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":true,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/metric_single_metric_data.json b/test/interpreter_functional/snapshots/session/metric_single_metric_data.json index b160e05935f17..759368c89f6a4 100644 --- a/test/interpreter_functional/snapshots/session/metric_single_metric_data.json +++ b/test/interpreter_functional/snapshots/session/metric_single_metric_data.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"},{"id":"col-2-1","meta":{"aggConfigParams":{"field":"bytes"},"indexPatternId":"logstash-*","type":"max"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"metrics":[{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"},{"id":"col-2-1","meta":{"field":"bytes","index":"logstash-*","params":{"id":"bytes","params":{"parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{"field":"bytes"},"schema":"metric","type":"max"},"type":"number"},"name":"Max bytes"}],"rows":[{"col-0-2":"200","col-1-1":12891,"col-2-1":19986},{"col-0-2":"404","col-1-1":696,"col-2-1":19881},{"col-0-2":"503","col-1-1":417,"col-2-1":0}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_1.json b/test/interpreter_functional/snapshots/session/partial_test_1.json index 9c642e5e266d0..4ad63a3e263e2 100644 --- a/test/interpreter_functional/snapshots/session/partial_test_1.json +++ b/test/interpreter_functional/snapshots/session/partial_test_1.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_2.json b/test/interpreter_functional/snapshots/session/partial_test_2.json index 2760875119197..622e4f3543884 100644 --- a/test/interpreter_functional/snapshots/session/partial_test_2.json +++ b/test/interpreter_functional/snapshots/session/partial_test_2.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/partial_test_3.json b/test/interpreter_functional/snapshots/session/partial_test_3.json index 4241d6f208bfd..78aa75b0e6725 100644 --- a/test/interpreter_functional/snapshots/session/partial_test_3.json +++ b/test/interpreter_functional/snapshots/session/partial_test_3.json @@ -1 +1 @@ -{"as":"visualization","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"region_map"}} \ No newline at end of file +{"as":"visualization","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"bucket":{"accessor":0},"metric":{"accessor":1,"format":{"id":"number"}}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"region_map"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/step_output_test2.json b/test/interpreter_functional/snapshots/session/step_output_test2.json index 84203617ff853..697ebde0fedd9 100644 --- a/test/interpreter_functional/snapshots/session/step_output_test2.json +++ b/test/interpreter_functional/snapshots/session/step_output_test2.json @@ -1 +1 @@ -{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"} \ No newline at end of file +{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/step_output_test3.json b/test/interpreter_functional/snapshots/session/step_output_test3.json index 2760875119197..622e4f3543884 100644 --- a/test/interpreter_functional/snapshots/session/step_output_test3.json +++ b/test/interpreter_functional/snapshots/session/step_output_test3.json @@ -1 +1 @@ -{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visType":"metric"}} \ No newline at end of file +{"as":"metric_vis","type":"render","value":{"params":{"listenOnChange":true},"visConfig":{"dimensions":{"bucket":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"metrics":[{"accessor":1,"format":{"id":"number","params":{}},"type":"vis_dimension"}]},"metric":{"colorSchema":"Green to Red","colorsRange":[{"from":0,"to":10000,"type":"range"}],"invertColors":false,"labels":{"show":true},"metricColorMode":"None","percentageMode":false,"style":{"bgColor":false,"bgFill":"#000","fontSize":60,"labelColor":false,"subText":""},"useRanges":false}},"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visType":"metric"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/tagcloud_all_data.json b/test/interpreter_functional/snapshots/session/tagcloud_all_data.json index 153eea71dd8d1..3340fc9d43b09 100644 --- a/test/interpreter_functional/snapshots/session/tagcloud_all_data.json +++ b/test/interpreter_functional/snapshots/session/tagcloud_all_data.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/tagcloud_fontsize.json b/test/interpreter_functional/snapshots/session/tagcloud_fontsize.json index d5f01afa468ab..1649f550f03d6 100644 --- a/test/interpreter_functional/snapshots/session/tagcloud_fontsize.json +++ b/test/interpreter_functional/snapshots/session/tagcloud_fontsize.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":40,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":20,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":40,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":20,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/tagcloud_invalid_data.json b/test/interpreter_functional/snapshots/session/tagcloud_invalid_data.json index 46b52a7b3eaae..0c50947beca97 100644 --- a/test/interpreter_functional/snapshots/session/tagcloud_invalid_data.json +++ b/test/interpreter_functional/snapshots/session/tagcloud_invalid_data.json @@ -1 +1 @@ -"[tagcloud] > [visdimension] > Can not cast 'null' to any of 'kibana_datatable'" \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[],"meta":{},"rows":[],"type":"datatable"},"visParams":{"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/tagcloud_metric_data.json b/test/interpreter_functional/snapshots/session/tagcloud_metric_data.json index 72b5e957c19a5..c2aefa4baebc2 100644 --- a/test/interpreter_functional/snapshots/session/tagcloud_metric_data.json +++ b/test/interpreter_functional/snapshots/session/tagcloud_metric_data.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"single","scale":"linear","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/snapshots/session/tagcloud_options.json b/test/interpreter_functional/snapshots/session/tagcloud_options.json index 7cbe7cc79882f..14864d4c07812 100644 --- a/test/interpreter_functional/snapshots/session/tagcloud_options.json +++ b/test/interpreter_functional/snapshots/session/tagcloud_options.json @@ -1 +1 @@ -{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"aggConfigParams":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"indexPatternId":"logstash-*","type":"terms"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"aggConfigParams":{},"indexPatternId":"logstash-*","type":"count"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"kibana_datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"multiple","scale":"log","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file +{"as":"tagloud_vis","type":"render","value":{"visData":{"columns":[{"id":"col-0-2","meta":{"field":"response.raw","index":"logstash-*","params":{"id":"terms","params":{"id":"string","missingBucketLabel":"Missing","otherBucketLabel":"Other","parsedUrl":{"basePath":"","origin":"http://localhost:5620","pathname":"/app/management"}}},"source":"esaggs","sourceParams":{"enabled":true,"id":"2","indexPatternId":"logstash-*","params":{"field":"response.raw","missingBucket":false,"missingBucketLabel":"Missing","order":"desc","orderBy":"1","otherBucket":false,"otherBucketLabel":"Other","size":4},"schema":"segment","type":"terms"},"type":"string"},"name":"response.raw: Descending"},{"id":"col-1-1","meta":{"field":null,"index":"logstash-*","params":{"id":"number"},"source":"esaggs","sourceParams":{"enabled":true,"id":"1","indexPatternId":"logstash-*","params":{},"schema":"metric","type":"count"},"type":"number"},"name":"Count"}],"rows":[{"col-0-2":"200","col-1-1":12891},{"col-0-2":"404","col-1-1":696},{"col-0-2":"503","col-1-1":417}],"type":"datatable"},"visParams":{"bucket":{"accessor":1,"format":{"id":"string","params":{}},"type":"vis_dimension"},"maxFontSize":72,"metric":{"accessor":0,"format":{"id":"string","params":{}},"type":"vis_dimension"},"minFontSize":18,"orientation":"multiple","scale":"log","showLabel":true},"visType":"tagcloud"}} \ No newline at end of file diff --git a/test/interpreter_functional/test_suites/run_pipeline/helpers.ts b/test/interpreter_functional/test_suites/run_pipeline/helpers.ts index bbf45b003c330..e5130ac95b7f8 100644 --- a/test/interpreter_functional/test_suites/run_pipeline/helpers.ts +++ b/test/interpreter_functional/test_suites/run_pipeline/helpers.ts @@ -176,10 +176,16 @@ export function expectExpressionProvider({ log.debug('starting to render'); const result = await browser.executeAsync( (_context: ExpressionResult, done: (renderResult: any) => void) => - window.renderPipelineResponse(_context).then((renderResult: any) => { - done(renderResult); - return renderResult; - }), + window + .renderPipelineResponse(_context) + .then((renderResult: any) => { + done(renderResult); + return renderResult; + }) + .catch((e) => { + done(e); + return e; + }), pipelineResponse ); log.debug('response of rendering: ', result); diff --git a/x-pack/plugins/canvas/public/components/datatable/datatable.tsx b/x-pack/plugins/canvas/public/components/datatable/datatable.tsx index bd343b15758bf..cd8a0e91510a3 100644 --- a/x-pack/plugins/canvas/public/components/datatable/datatable.tsx +++ b/x-pack/plugins/canvas/public/components/datatable/datatable.tsx @@ -9,11 +9,9 @@ import PropTypes from 'prop-types'; import { EuiIcon, EuiPagination } from '@elastic/eui'; import moment from 'moment'; import { Paginate } from '../paginate'; -import { Datatable as DatatableType, DatatableColumn } from '../../../types'; +import { Datatable as DatatableType, DatatableColumn, DatatableColumnType } from '../../../types'; -type IconType = 'string' | 'number' | 'date' | 'boolean' | 'null'; - -const getIcon = (type: IconType) => { +const getIcon = (type: DatatableColumnType | null) => { if (type === null) { return; } diff --git a/x-pack/plugins/canvas/types/state.ts b/x-pack/plugins/canvas/types/state.ts index e9b580f81e668..60407b78ab5e3 100644 --- a/x-pack/plugins/canvas/types/state.ts +++ b/x-pack/plugins/canvas/types/state.ts @@ -10,7 +10,6 @@ import { ExpressionImage, ExpressionFunction, KibanaContext, - KibanaDatatable, PointSeries, Render, Style, @@ -49,7 +48,6 @@ type ExpressionType = | ExpressionValueFilter | ExpressionImage | KibanaContext - | KibanaDatatable | PointSeries | Style | Range; diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts index 64af67aefa4be..79d380991f5fd 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts +++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts @@ -6,6 +6,7 @@ import { UrlDrilldown, ActionContext, Config } from './url_drilldown'; import { IEmbeddable } from '../../../../../../src/plugins/embeddable/public/lib/embeddables'; +import { DatatableColumnType } from '../../../../../../src/plugins/expressions/common'; const mockDataPoints = [ { @@ -15,12 +16,17 @@ const mockDataPoints = [ name: 'test', id: '1-1', meta: { - type: 'histogram', - indexPatternId: 'logstash-*', - aggConfigParams: { - field: 'bytes', - interval: 30, - otherBucket: true, + type: 'number' as DatatableColumnType, + field: 'bytes', + index: 'logstash-*', + sourceParams: { + indexPatternId: 'logstash-*', + type: 'histogram', + params: { + field: 'bytes', + interval: 30, + otherBucket: true, + }, }, }, }, diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts index bb1baf5b96428..6989819da2b0b 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts +++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.test.ts @@ -9,6 +9,7 @@ import { getMockEventScope, ValueClickTriggerEventScope, } from './url_drilldown_scope'; +import { DatatableColumnType } from '../../../../../../src/plugins/expressions/common'; const createPoint = ({ field, @@ -23,10 +24,12 @@ const createPoint = ({ name: field, id: '1-1', meta: { - type: 'histogram', - indexPatternId: 'logstash-*', - aggConfigParams: { - field, + type: 'date' as DatatableColumnType, + field, + source: 'esaggs', + sourceParams: { + type: 'histogram', + indexPatternId: 'logstash-*', interval: 30, otherBucket: true, }, diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts index 15a9a3ba77d88..0f66cb144c967 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts +++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown_scope.ts @@ -131,7 +131,7 @@ function getEventScopeFromRangeSelectTriggerContext( const { table, column: columnIndex, range } = eventScopeInput.data; const column = table.columns[columnIndex]; return cleanEmptyKeys({ - key: toPrimitiveOrUndefined(column?.meta?.aggConfigParams?.field) as string, + key: toPrimitiveOrUndefined(column?.meta.field) as string, from: toPrimitiveOrUndefined(range[0]) as string | number | undefined, to: toPrimitiveOrUndefined(range[range.length - 1]) as string | number | undefined, }); @@ -145,7 +145,7 @@ function getEventScopeFromValueClickTriggerContext( const column = table.columns[columnIndex]; return { value: toPrimitiveOrUndefined(value) as Primitive, - key: toPrimitiveOrUndefined(column?.meta?.aggConfigParams?.field) as string | undefined, + key: column?.meta?.field, }; }); diff --git a/x-pack/plugins/lens/public/datatable_visualization/expression.test.tsx b/x-pack/plugins/lens/public/datatable_visualization/expression.test.tsx index eb00cf93ccd34..c95f6085b4791 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/expression.test.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/expression.test.tsx @@ -13,20 +13,50 @@ import { DatatableProps } from './expression'; import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; import { IFieldFormat } from '../../../../../src/plugins/data/public'; import { IAggType } from 'src/plugins/data/public'; -const onClickValue = jest.fn(); import { EmptyPlaceholder } from '../shared_components'; import { LensIconChartDatatable } from '../assets/chart_datatable'; function sampleArgs() { + const indexPatternId = 'indexPatternId'; const data: LensMultiTable = { type: 'lens_multitable', tables: { l1: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a', meta: { type: 'terms' } }, - { id: 'b', name: 'b', meta: { type: 'date_histogram', aggConfigParams: { field: 'b' } } }, - { id: 'c', name: 'c', meta: { type: 'count' } }, + { + id: 'a', + name: 'a', + meta: { + type: 'string', + source: 'esaggs', + field: 'a', + sourceParams: { type: 'terms', indexPatternId }, + }, + }, + { + id: 'b', + name: 'b', + meta: { + type: 'date', + field: 'b', + source: 'esaggs', + sourceParams: { + type: 'date_histogram', + indexPatternId, + }, + }, + }, + { + id: 'c', + name: 'c', + meta: { + type: 'number', + source: 'esaggs', + field: 'c', + sourceParams: { indexPatternId, type: 'count' }, + }, + }, ], rows: [{ a: 'shoes', b: 1588024800000, c: 3 }], }, @@ -45,6 +75,11 @@ function sampleArgs() { } describe('datatable_expression', () => { + let onClickValue: jest.Mock; + beforeEach(() => { + onClickValue = jest.fn(); + }); + describe('datatable renders', () => { test('it renders with the specified data and args', () => { const { data, args } = sampleArgs(); @@ -106,7 +141,7 @@ describe('datatable_expression', () => { }, ], negate: true, - timeFieldName: undefined, + timeFieldName: 'a', }); }); @@ -150,10 +185,27 @@ describe('datatable_expression', () => { type: 'lens_multitable', tables: { l1: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a', meta: { type: 'date_range', aggConfigParams: { field: 'a' } } }, - { id: 'b', name: 'b', meta: { type: 'count' } }, + { + id: 'a', + name: 'a', + meta: { + type: 'date', + source: 'esaggs', + field: 'a', + sourceParams: { type: 'date_range', indexPatternId: 'a' }, + }, + }, + { + id: 'b', + name: 'b', + meta: { + type: 'number', + source: 'esaggs', + sourceParams: { type: 'count', indexPatternId: 'a' }, + }, + }, ], rows: [{ a: 1588024800000, b: 3 }], }, diff --git a/x-pack/plugins/lens/public/datatable_visualization/expression.tsx b/x-pack/plugins/lens/public/datatable_visualization/expression.tsx index af1773b413599..6502e07697816 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/expression.tsx @@ -166,15 +166,15 @@ export function DatatableComponent(props: DatatableRenderProps) { const formatters: Record> = {}; firstTable.columns.forEach((column) => { - formatters[column.id] = props.formatFactory(column.formatHint); + formatters[column.id] = props.formatFactory(column.meta?.params); }); const { onClickValue } = props; const handleFilterClick = useMemo( () => (field: string, value: unknown, colIndex: number, negate: boolean = false) => { const col = firstTable.columns[colIndex]; - const isDate = col.meta?.type === 'date_histogram' || col.meta?.type === 'date_range'; - const timeFieldName = negate && isDate ? undefined : col?.meta?.aggConfigParams?.field; + const isDate = col.meta?.type === 'date'; + const timeFieldName = negate && isDate ? undefined : col?.meta?.field; const rowIndex = firstTable.rows.findIndex((row) => row[field] === value); const data: LensFilterEvent['data'] = { @@ -196,7 +196,10 @@ export function DatatableComponent(props: DatatableRenderProps) { const bucketColumns = firstTable.columns .filter((col) => { - return col?.meta?.type && props.getType(col.meta.type)?.type === 'buckets'; + return ( + col?.meta?.sourceParams?.type && + props.getType(col.meta.sourceParams.type as string)?.type === 'buckets' + ); }) .map((col) => col.id); @@ -230,7 +233,7 @@ export function DatatableComponent(props: DatatableRenderProps) { name: (col && col.name) || '', render: (value: unknown) => { const formattedValue = formatters[field]?.convert(value); - const fieldName = col?.meta?.aggConfigParams?.field; + const fieldName = col?.meta?.field; if (filterable) { return ( diff --git a/x-pack/plugins/lens/public/editor_frame_service/format_column.ts b/x-pack/plugins/lens/public/editor_frame_service/format_column.ts index b95139a00ec57..2da6e7195a5e1 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/format_column.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/format_column.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ExpressionFunctionDefinition, KibanaDatatable } from 'src/plugins/expressions/public'; +import { ExpressionFunctionDefinition, Datatable } from 'src/plugins/expressions/public'; interface FormatColumn { format: string; @@ -41,12 +41,12 @@ const supportedFormats: Record = { name: 'lens_format_column', - type: 'kibana_datatable', + type: 'datatable', help: '', args: { format: { @@ -64,7 +64,7 @@ export const formatColumn: ExpressionFunctionDefinition< help: '', }, }, - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], fn(input, { format, columnId, decimals }: FormatColumn) { return { ...input, @@ -73,15 +73,23 @@ export const formatColumn: ExpressionFunctionDefinition< if (supportedFormats[format]) { return { ...col, - formatHint: { - id: format, - params: { pattern: supportedFormats[format].decimalsToPattern(decimals) }, + meta: { + ...col.meta, + params: { + id: format, + params: { pattern: supportedFormats[format].decimalsToPattern(decimals) }, + }, }, }; } else { return { ...col, - formatHint: { id: format, params: {} }, + meta: { + ...col.meta, + params: { + id: format, + }, + }, }; } } diff --git a/x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts index b3da722de5f34..5afabb9a52367 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.test.ts @@ -6,15 +6,15 @@ import moment from 'moment'; import { mergeTables } from './merge_tables'; -import { KibanaDatatable } from 'src/plugins/expressions'; +import { Datatable } from 'src/plugins/expressions'; describe('lens_merge_tables', () => { it('should produce a row with the nested table as defined', () => { - const sampleTable1: KibanaDatatable = { - type: 'kibana_datatable', + const sampleTable1: Datatable = { + type: 'datatable', columns: [ - { id: 'bucket', name: 'A' }, - { id: 'count', name: 'Count' }, + { id: 'bucket', name: 'A', meta: { type: 'string' } }, + { id: 'count', name: 'Count', meta: { type: 'number' } }, ], rows: [ { bucket: 'a', count: 5 }, @@ -22,11 +22,11 @@ describe('lens_merge_tables', () => { ], }; - const sampleTable2: KibanaDatatable = { - type: 'kibana_datatable', + const sampleTable2: Datatable = { + type: 'datatable', columns: [ - { id: 'bucket', name: 'C' }, - { id: 'avg', name: 'Average' }, + { id: 'bucket', name: 'C', meta: { type: 'string' } }, + { id: 'avg', name: 'Average', meta: { type: 'number' } }, ], rows: [ { bucket: 'a', avg: 2.5 }, diff --git a/x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts index 7c10ee4a57fad..e4f7b07084ea9 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/merge_tables.ts @@ -6,9 +6,9 @@ import { i18n } from '@kbn/i18n'; import { + Datatable, ExpressionFunctionDefinition, ExpressionValueSearchContext, - KibanaDatatable, } from 'src/plugins/expressions/public'; import { search } from '../../../../../src/plugins/data/public'; const { toAbsoluteDates } = search.aggs; @@ -17,7 +17,7 @@ import { LensMultiTable } from '../types'; interface MergeTables { layerIds: string[]; - tables: KibanaDatatable[]; + tables: Datatable[]; } export const mergeTables: ExpressionFunctionDefinition< @@ -38,14 +38,14 @@ export const mergeTables: ExpressionFunctionDefinition< multi: true, }, tables: { - types: ['kibana_datatable'], + types: ['datatable'], help: '', multi: true, }, }, inputTypes: ['kibana_context', 'null'], fn(input, { layerIds, tables }) { - const resultTables: Record = {}; + const resultTables: Record = {}; tables.forEach((table, index) => { resultTables[layerIds[index]] = table; }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts index 4bfd6a4f93c75..43285d657dd40 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.test.ts @@ -5,16 +5,16 @@ */ import { renameColumns } from './rename_columns'; -import { KibanaDatatable } from '../../../../../src/plugins/expressions/public'; +import { Datatable } from '../../../../../src/plugins/expressions/public'; import { createMockExecutionContext } from '../../../../../src/plugins/expressions/common/mocks'; describe('rename_columns', () => { it('should rename columns of a given datatable', () => { - const input: KibanaDatatable = { - type: 'kibana_datatable', + const input: Datatable = { + type: 'datatable', columns: [ - { id: 'a', name: 'A' }, - { id: 'b', name: 'B' }, + { id: 'a', name: 'A', meta: { type: 'number' } }, + { id: 'b', name: 'B', meta: { type: 'number' } }, ], rows: [ { a: 1, b: 2 }, @@ -46,10 +46,16 @@ describe('rename_columns', () => { "columns": Array [ Object { "id": "b", + "meta": Object { + "type": "number", + }, "name": "Austrailia", }, Object { "id": "c", + "meta": Object { + "type": "number", + }, "name": "Boomerang", }, ], @@ -71,15 +77,15 @@ describe('rename_columns', () => { "c": 8, }, ], - "type": "kibana_datatable", + "type": "datatable", } `); }); it('should replace "" with a visible value', () => { - const input: KibanaDatatable = { - type: 'kibana_datatable', - columns: [{ id: 'a', name: 'A' }], + const input: Datatable = { + type: 'datatable', + columns: [{ id: 'a', name: 'A', meta: { type: 'string' } }], rows: [{ a: '' }], }; @@ -100,11 +106,11 @@ describe('rename_columns', () => { }); it('should keep columns which are not mapped', () => { - const input: KibanaDatatable = { - type: 'kibana_datatable', + const input: Datatable = { + type: 'datatable', columns: [ - { id: 'a', name: 'A' }, - { id: 'b', name: 'B' }, + { id: 'a', name: 'A', meta: { type: 'number' } }, + { id: 'b', name: 'B', meta: { type: 'number' } }, ], rows: [ { a: 1, b: 2 }, @@ -129,10 +135,16 @@ describe('rename_columns', () => { "columns": Array [ Object { "id": "a", + "meta": Object { + "type": "number", + }, "name": "A", }, Object { "id": "c", + "meta": Object { + "type": "number", + }, "name": "Catamaran", }, ], @@ -154,17 +166,17 @@ describe('rename_columns', () => { "c": 8, }, ], - "type": "kibana_datatable", + "type": "datatable", } `); }); it('should rename date histograms', () => { - const input: KibanaDatatable = { - type: 'kibana_datatable', + const input: Datatable = { + type: 'datatable', columns: [ - { id: 'a', name: 'A' }, - { id: 'b', name: 'banana per 30 seconds' }, + { id: 'a', name: 'A', meta: { type: 'number' } }, + { id: 'b', name: 'banana per 30 seconds', meta: { type: 'number' } }, ], rows: [ { a: 1, b: 2 }, @@ -189,10 +201,16 @@ describe('rename_columns', () => { "columns": Array [ Object { "id": "a", + "meta": Object { + "type": "number", + }, "name": "A", }, Object { "id": "c", + "meta": Object { + "type": "number", + }, "name": "Apple per 30 seconds", }, ], @@ -214,7 +232,7 @@ describe('rename_columns', () => { "c": 8, }, ], - "type": "kibana_datatable", + "type": "datatable", } `); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.ts b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.ts index bf938a3e05ef6..74f143225e293 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/rename_columns.ts @@ -5,11 +5,7 @@ */ import { i18n } from '@kbn/i18n'; -import { - ExpressionFunctionDefinition, - KibanaDatatable, - KibanaDatatableColumn, -} from 'src/plugins/expressions'; +import { ExpressionFunctionDefinition, Datatable, DatatableColumn } from 'src/plugins/expressions'; import { IndexPatternColumn } from './operations'; interface RemapArgs { @@ -20,12 +16,12 @@ export type OriginalColumn = { id: string } & IndexPatternColumn; export const renameColumns: ExpressionFunctionDefinition< 'lens_rename_columns', - KibanaDatatable, + Datatable, RemapArgs, - KibanaDatatable + Datatable > = { name: 'lens_rename_columns', - type: 'kibana_datatable', + type: 'datatable', help: i18n.translate('xpack.lens.functions.renameColumns.help', { defaultMessage: 'A helper to rename the columns of a datatable', }), @@ -38,12 +34,12 @@ export const renameColumns: ExpressionFunctionDefinition< }), }, }, - inputTypes: ['kibana_datatable'], + inputTypes: ['datatable'], fn(data, { idMap: encodedIdMap }) { const idMap = JSON.parse(encodedIdMap) as Record; return { - type: 'kibana_datatable', + type: 'datatable', rows: data.rows.map((row) => { const mappedRow: Record = {}; Object.entries(idMap).forEach(([fromId, toId]) => { @@ -77,7 +73,7 @@ export const renameColumns: ExpressionFunctionDefinition< }, }; -function getColumnName(originalColumn: OriginalColumn, newColumn: KibanaDatatableColumn) { +function getColumnName(originalColumn: OriginalColumn, newColumn: DatatableColumn) { if (originalColumn && originalColumn.operationType === 'date_histogram') { const fieldName = originalColumn.sourceField; diff --git a/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx b/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx index 7e80fcc06dff8..88ce026fc2692 100644 --- a/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/expression.test.tsx @@ -17,11 +17,11 @@ function sampleArgs() { type: 'lens_multitable', tables: { l1: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, + { id: 'a', name: 'a', meta: { type: 'string' } }, + { id: 'b', name: 'b', meta: { type: 'string' } }, + { id: 'c', name: 'c', meta: { type: 'number' } }, ], rows: [{ a: 10110, b: 2, c: 3 }], }, diff --git a/x-pack/plugins/lens/public/metric_visualization/expression.tsx b/x-pack/plugins/lens/public/metric_visualization/expression.tsx index 58814f62da60a..6522a4c457949 100644 --- a/x-pack/plugins/lens/public/metric_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/metric_visualization/expression.tsx @@ -136,8 +136,8 @@ export function MetricChart({ } const value = - column && column.formatHint - ? formatFactory(column.formatHint).convert(row[accessor]) + column && column.meta?.params + ? formatFactory(column.meta?.params).convert(row[accessor]) : Number(Number(row[accessor]).toFixed(3)).toString(); return ( diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx index ac952e307758b..8ab1a8b5a58d8 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.test.tsx @@ -31,11 +31,11 @@ describe('PieVisualization component', () => { type: 'lens_multitable', tables: { first: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'string' } }, ], rows: [ { a: 6, b: 2, c: 'I', d: 'Row 1' }, @@ -138,14 +138,23 @@ describe('PieVisualization component', () => { "columns": Array [ Object { "id": "a", + "meta": Object { + "type": "number", + }, "name": "a", }, Object { "id": "b", + "meta": Object { + "type": "number", + }, "name": "b", }, Object { "id": "c", + "meta": Object { + "type": "string", + }, "name": "c", }, ], @@ -163,7 +172,7 @@ describe('PieVisualization component', () => { "d": "Row 2", }, ], - "type": "kibana_datatable", + "type": "datatable", }, "value": 6, }, diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx index 8de810f9aa5d3..cb2458a76967c 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx @@ -68,7 +68,7 @@ export function PieComponent( if (!hideLabels) { firstTable.columns.forEach((column) => { - formatters[column.id] = props.formatFactory(column.formatHint); + formatters[column.id] = props.formatFactory(column.meta.params); }); } @@ -108,7 +108,7 @@ export function PieComponent( if (hideLabels || d === EMPTY_SLICE) { return ''; } - if (col.formatHint) { + if (col.meta.params) { return formatters[col.id].convert(d) ?? ''; } return String(d); diff --git a/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts b/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts index 8b94ff3236a44..d9ccda2a99ab2 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts +++ b/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts @@ -4,15 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaDatatable } from 'src/plugins/expressions/public'; +import { Datatable } from 'src/plugins/expressions/public'; import { getSliceValueWithFallback, getFilterContext } from './render_helpers'; +import { ColumnGroups } from './types'; describe('render helpers', () => { describe('#getSliceValueWithFallback', () => { describe('without fallback', () => { - const columnGroups = [ - { col: { id: 'a', name: 'A' }, metrics: [] }, - { col: { id: 'b', name: 'C' }, metrics: [] }, + const columnGroups: ColumnGroups = [ + { col: { id: 'a', name: 'A', meta: { type: 'string' } }, metrics: [] }, + { col: { id: 'b', name: 'C', meta: { type: 'string' } }, metrics: [] }, ]; it('returns the metric when positive number', () => { @@ -20,6 +21,7 @@ describe('render helpers', () => { getSliceValueWithFallback({ a: 'Cat', b: 'Home', c: 5 }, columnGroups, { id: 'c', name: 'C', + meta: { type: 'number' }, }) ).toEqual(5); }); @@ -29,6 +31,7 @@ describe('render helpers', () => { getSliceValueWithFallback({ a: 'Cat', b: 'Home', c: -100 }, columnGroups, { id: 'c', name: 'C', + meta: { type: 'number' }, }) ).toEqual(-100); }); @@ -38,15 +41,19 @@ describe('render helpers', () => { getSliceValueWithFallback({ a: 'Cat', b: 'Home', c: 0 }, columnGroups, { id: 'c', name: 'C', + meta: { type: 'number' }, }) ).toEqual(Number.EPSILON); }); }); describe('fallback behavior', () => { - const columnGroups = [ - { col: { id: 'a', name: 'A' }, metrics: [{ id: 'a_subtotal', name: '' }] }, - { col: { id: 'b', name: 'C' }, metrics: [] }, + const columnGroups: ColumnGroups = [ + { + col: { id: 'a', name: 'A', meta: { type: 'string' } }, + metrics: [{ id: 'a_subtotal', name: '', meta: { type: 'number' } }], + }, + { col: { id: 'b', name: 'C', meta: { type: 'string' } }, metrics: [] }, ]; it('falls back to metric from previous column if available', () => { @@ -54,7 +61,7 @@ describe('render helpers', () => { getSliceValueWithFallback( { a: 'Cat', a_subtotal: 5, b: 'Home', c: undefined }, columnGroups, - { id: 'c', name: 'C' } + { id: 'c', name: 'C', meta: { type: 'number' } } ) ).toEqual(5); }); @@ -64,7 +71,7 @@ describe('render helpers', () => { getSliceValueWithFallback( { a: 'Cat', a_subtotal: 0, b: 'Home', c: undefined }, columnGroups, - { id: 'c', name: 'C' } + { id: 'c', name: 'C', meta: { type: 'number' } } ) ).toEqual(Number.EPSILON); }); @@ -74,7 +81,7 @@ describe('render helpers', () => { getSliceValueWithFallback( { a: 'Cat', a_subtotal: undefined, b: 'Home', c: undefined }, columnGroups, - { id: 'c', name: 'C' } + { id: 'c', name: 'C', meta: { type: 'number' } } ) ).toEqual(Number.EPSILON); }); @@ -83,11 +90,11 @@ describe('render helpers', () => { describe('#getFilterContext', () => { it('handles single slice click for single ring', () => { - const table: KibanaDatatable = { - type: 'kibana_datatable', + const table: Datatable = { + type: 'datatable', columns: [ - { id: 'a', name: 'A' }, - { id: 'b', name: 'B' }, + { id: 'a', name: 'A', meta: { type: 'string' } }, + { id: 'b', name: 'B', meta: { type: 'number' } }, ], rows: [ { a: 'Hi', b: 2 }, @@ -108,12 +115,12 @@ describe('render helpers', () => { }); it('handles single slice click with 2 rings', () => { - const table: KibanaDatatable = { - type: 'kibana_datatable', + const table: Datatable = { + type: 'datatable', columns: [ - { id: 'a', name: 'A' }, - { id: 'b', name: 'B' }, - { id: 'c', name: 'C' }, + { id: 'a', name: 'A', meta: { type: 'string' } }, + { id: 'b', name: 'B', meta: { type: 'string' } }, + { id: 'c', name: 'C', meta: { type: 'number' } }, ], rows: [ { a: 'Hi', b: 'Two', c: 2 }, @@ -134,12 +141,12 @@ describe('render helpers', () => { }); it('finds right row for multi slice click', () => { - const table: KibanaDatatable = { - type: 'kibana_datatable', + const table: Datatable = { + type: 'datatable', columns: [ - { id: 'a', name: 'A' }, - { id: 'b', name: 'B' }, - { id: 'c', name: 'C' }, + { id: 'a', name: 'A', meta: { type: 'string' } }, + { id: 'b', name: 'B', meta: { type: 'string' } }, + { id: 'c', name: 'C', meta: { type: 'number' } }, ], rows: [ { a: 'Hi', b: 'Two', c: 2 }, diff --git a/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts b/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts index aafbb477bab22..26b4f9ccda853 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts +++ b/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts @@ -5,14 +5,14 @@ */ import { Datum, LayerValue } from '@elastic/charts'; -import { KibanaDatatable, KibanaDatatableColumn } from 'src/plugins/expressions/public'; +import { Datatable, DatatableColumn } from 'src/plugins/expressions/public'; import { ColumnGroups } from './types'; import { LensFilterEvent } from '../types'; export function getSliceValueWithFallback( d: Datum, reverseGroups: ColumnGroups, - metricColumn: KibanaDatatableColumn + metricColumn: DatatableColumn ) { if (typeof d[metricColumn.id] === 'number' && d[metricColumn.id] !== 0) { return d[metricColumn.id]; @@ -27,7 +27,7 @@ export function getSliceValueWithFallback( export function getFilterContext( clickedLayers: LayerValue[], layerColumnIds: string[], - table: KibanaDatatable + table: Datatable ): LensFilterEvent['data'] { const matchingIndex = table.rows.findIndex((row) => clickedLayers.every((layer, index) => { diff --git a/x-pack/plugins/lens/public/pie_visualization/types.ts b/x-pack/plugins/lens/public/pie_visualization/types.ts index 603c80aa00066..0596e54870a94 100644 --- a/x-pack/plugins/lens/public/pie_visualization/types.ts +++ b/x-pack/plugins/lens/public/pie_visualization/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaDatatableColumn } from 'src/plugins/expressions/public'; +import { DatatableColumn } from 'src/plugins/expressions/public'; import { LensMultiTable } from '../types'; export interface SharedLayerState { @@ -40,6 +40,6 @@ export interface PieExpressionProps { } export type ColumnGroups = Array<{ - col: KibanaDatatableColumn; - metrics: KibanaDatatableColumn[]; + col: DatatableColumn; + metrics: DatatableColumn[]; }>; diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 2b9ca5a2425f8..e70436163b23d 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -11,7 +11,7 @@ import { SavedObjectReference } from 'kibana/public'; import { ExpressionRendererEvent, IInterpreterRenderHandlers, - KibanaDatatable, + Datatable, SerializedFieldFormat, } from '../../../../src/plugins/expressions/public'; import { DragContextState } from './drag_drop'; @@ -304,7 +304,7 @@ export interface OperationMetadata { export interface LensMultiTable { type: 'lens_multitable'; - tables: Record; + tables: Record; dateRange?: { fromDate: Date; toDate: Date; diff --git a/x-pack/plugins/lens/public/utils.test.ts b/x-pack/plugins/lens/public/utils.test.ts index 170579b7c551b..59b81fd3d1136 100644 --- a/x-pack/plugins/lens/public/utils.test.ts +++ b/x-pack/plugins/lens/public/utils.test.ts @@ -6,10 +6,12 @@ import { LensFilterEvent } from './types'; import { desanitizeFilterContext } from './utils'; +import { Datatable } from '../../../../src/plugins/expressions/common'; describe('desanitizeFilterContext', () => { it(`When filtered value equals '(empty)' replaces it with '' in table and in value.`, () => { - const table = { + const table: Datatable = { + type: 'datatable', rows: [ { 'f903668f-1175-4705-a5bd-713259d10326': 1589414640000, @@ -35,14 +37,17 @@ describe('desanitizeFilterContext', () => { { id: 'f903668f-1175-4705-a5bd-713259d10326', name: 'order_date per 30 seconds', + meta: { type: 'date' }, }, { id: '5d5446b2-72e8-4f86-91e0-88380f0fa14c', name: 'Top values of customer_phone', + meta: { type: 'string' }, }, { id: '9f0b6f88-c399-43a0-a993-0ad943c9af25', name: 'Count of records', + meta: { type: 'number' }, }, ], }; @@ -102,6 +107,7 @@ describe('desanitizeFilterContext', () => { }, ], columns: table.columns, + type: 'datatable', }, }, ], diff --git a/x-pack/plugins/lens/public/utils.ts b/x-pack/plugins/lens/public/utils.ts index 171707dcb9d26..0461e600d2b4c 100644 --- a/x-pack/plugins/lens/public/utils.ts +++ b/x-pack/plugins/lens/public/utils.ts @@ -14,7 +14,7 @@ export const desanitizeFilterContext = ( const emptyTextValue = i18n.translate('xpack.lens.indexpattern.emptyTextColumnValue', { defaultMessage: '(empty)', }); - return { + const result: LensFilterEvent['data'] = { ...context, data: context.data.map((point) => point.value === emptyTextValue @@ -36,4 +36,8 @@ export const desanitizeFilterContext = ( : point ), }; + if (context.timeFieldName) { + result.timeFieldName = context.timeFieldName; + } + return result; }; diff --git a/x-pack/plugins/lens/public/xy_visualization/axes_configuration.test.ts b/x-pack/plugins/lens/public/xy_visualization/axes_configuration.test.ts index 15c08d17e49c6..a823a6370270d 100644 --- a/x-pack/plugins/lens/public/xy_visualization/axes_configuration.test.ts +++ b/x-pack/plugins/lens/public/xy_visualization/axes_configuration.test.ts @@ -5,13 +5,13 @@ */ import { LayerArgs } from './types'; -import { KibanaDatatable } from '../../../../../src/plugins/expressions/public'; +import { Datatable } from '../../../../../src/plugins/expressions/public'; import { getAxesConfiguration } from './axes_configuration'; describe('axes_configuration', () => { - const tables: Record = { + const tables: Record = { first: { - type: 'kibana_datatable', + type: 'datatable', rows: [ { xAccessorId: 1585758120000, @@ -99,48 +99,60 @@ describe('axes_configuration', () => { id: 'xAccessorId', name: 'order_date per minute', meta: { - type: 'date_histogram', - indexPatternId: 'indexPatternId', - aggConfigParams: { - field: 'order_date', - timeRange: { from: '2020-04-01T16:14:16.246Z', to: '2020-04-01T17:15:41.263Z' }, - useNormalizedEsInterval: true, - scaleMetricValues: false, - interval: '1m', - drop_partials: false, - min_doc_count: 0, - extended_bounds: {}, + type: 'date', + field: 'order_date', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'date_histogram', + params: { + field: 'order_date', + timeRange: { from: '2020-04-01T16:14:16.246Z', to: '2020-04-01T17:15:41.263Z' }, + useNormalizedEsInterval: true, + scaleMetricValues: false, + interval: '1m', + drop_partials: false, + min_doc_count: 0, + extended_bounds: {}, + }, }, + params: { params: { id: 'date', params: { pattern: 'HH:mm' } } }, }, - formatHint: { id: 'date', params: { pattern: 'HH:mm' } }, }, { id: 'splitAccessorId', name: 'Top values of category.keyword', meta: { - type: 'terms', - indexPatternId: 'indexPatternId', - aggConfigParams: { - field: 'category.keyword', - orderBy: 'yAccessorId', - order: 'desc', - size: 3, - otherBucket: false, - otherBucketLabel: 'Other', - missingBucket: false, - missingBucketLabel: 'Missing', + type: 'string', + field: 'category.keyword', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'terms', + params: { + field: 'category.keyword', + orderBy: 'yAccessorId', + order: 'desc', + size: 3, + otherBucket: false, + otherBucketLabel: 'Other', + missingBucket: false, + missingBucketLabel: 'Missing', + }, }, - }, - formatHint: { - id: 'terms', params: { - id: 'string', - otherBucketLabel: 'Other', - missingBucketLabel: 'Missing', - parsedUrl: { - origin: 'http://localhost:5601', - pathname: '/jiy/app/kibana', - basePath: '/jiy', + id: 'terms', + params: { + id: 'string', + otherBucketLabel: 'Other', + missingBucketLabel: 'Missing', + parsedUrl: { + origin: 'http://localhost:5601', + pathname: '/jiy/app/kibana', + basePath: '/jiy', + }, }, }, }, @@ -149,41 +161,57 @@ describe('axes_configuration', () => { id: 'yAccessorId', name: 'Count of records', meta: { - type: 'count', - indexPatternId: 'indexPatternId', - aggConfigParams: {}, + type: 'number', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'count', + }, + params: { id: 'number' }, }, - formatHint: { id: 'number' }, }, { id: 'yAccessorId2', name: 'Other column', meta: { - type: 'average', - indexPatternId: 'indexPatternId', - aggConfigParams: {}, + type: 'number', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'average', + }, + params: { id: 'bytes' }, }, - formatHint: { id: 'bytes' }, }, { id: 'yAccessorId3', name: 'Other column', meta: { - type: 'average', - indexPatternId: 'indexPatternId', - aggConfigParams: {}, + type: 'number', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'average', + }, + params: { id: 'currency' }, }, - formatHint: { id: 'currency' }, }, { id: 'yAccessorId4', name: 'Other column', meta: { - type: 'average', - indexPatternId: 'indexPatternId', - aggConfigParams: {}, + type: 'number', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'average', + }, + params: { id: 'currency' }, }, - formatHint: { id: 'currency' }, }, ], }, diff --git a/x-pack/plugins/lens/public/xy_visualization/axes_configuration.ts b/x-pack/plugins/lens/public/xy_visualization/axes_configuration.ts index 876baaabb57c5..3c312abf1fd91 100644 --- a/x-pack/plugins/lens/public/xy_visualization/axes_configuration.ts +++ b/x-pack/plugins/lens/public/xy_visualization/axes_configuration.ts @@ -5,10 +5,7 @@ */ import { LayerConfig } from './types'; -import { - KibanaDatatable, - SerializedFieldFormat, -} from '../../../../../src/plugins/expressions/public'; +import { Datatable, SerializedFieldFormat } from '../../../../../src/plugins/expressions/public'; import { IFieldFormat } from '../../../../../src/plugins/data/public'; interface FormattedMetric { @@ -34,7 +31,7 @@ export function isFormatterCompatible( export function getAxesConfiguration( layers: LayerConfig[], shouldRotate: boolean, - tables?: Record, + tables?: Record, formatFactory?: (mapping: SerializedFieldFormat) => IFieldFormat ): GroupsConfiguration { const series: { auto: FormattedMetric[]; left: FormattedMetric[]; right: FormattedMetric[] } = { @@ -50,7 +47,7 @@ export function getAxesConfiguration( layer.yConfig?.find((yAxisConfig) => yAxisConfig.forAccessor === accessor)?.axisMode || 'auto'; let formatter: SerializedFieldFormat = table?.columns.find((column) => column.id === accessor) - ?.formatHint || { id: 'number' }; + ?.meta?.params || { id: 'number' }; if (layer.seriesType.includes('percentage') && formatter.id !== 'percent') { formatter = { id: 'percent', diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx index e7da850983de6..9e937399a7969 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.test.tsx @@ -19,7 +19,7 @@ import { } from '@elastic/charts'; import { xyChart, XYChart } from './expression'; import { LensMultiTable } from '../types'; -import { KibanaDatatable, KibanaDatatableRow } from '../../../../../src/plugins/expressions/public'; +import { Datatable, DatatableRow } from '../../../../../src/plugins/expressions/public'; import React from 'react'; import { shallow } from 'enzyme'; import { @@ -46,7 +46,7 @@ const dateHistogramData: LensMultiTable = { type: 'lens_multitable', tables: { timeLayer: { - type: 'kibana_datatable', + type: 'datatable', rows: [ { xAccessorId: 1585758120000, @@ -104,48 +104,60 @@ const dateHistogramData: LensMultiTable = { id: 'xAccessorId', name: 'order_date per minute', meta: { - type: 'date_histogram', - indexPatternId: 'indexPatternId', - aggConfigParams: { - field: 'order_date', - timeRange: { from: '2020-04-01T16:14:16.246Z', to: '2020-04-01T17:15:41.263Z' }, - useNormalizedEsInterval: true, - scaleMetricValues: false, - interval: '1m', - drop_partials: false, - min_doc_count: 0, - extended_bounds: {}, + type: 'date', + field: 'order_date', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'date_histogram', + params: { + field: 'order_date', + timeRange: { from: '2020-04-01T16:14:16.246Z', to: '2020-04-01T17:15:41.263Z' }, + useNormalizedEsInterval: true, + scaleMetricValues: false, + interval: '1m', + drop_partials: false, + min_doc_count: 0, + extended_bounds: {}, + }, }, + params: { id: 'date', params: { pattern: 'HH:mm' } }, }, - formatHint: { id: 'date', params: { pattern: 'HH:mm' } }, }, { id: 'splitAccessorId', name: 'Top values of category.keyword', meta: { - type: 'terms', - indexPatternId: 'indexPatternId', - aggConfigParams: { - field: 'category.keyword', - orderBy: 'yAccessorId', - order: 'desc', - size: 3, - otherBucket: false, - otherBucketLabel: 'Other', - missingBucket: false, - missingBucketLabel: 'Missing', + type: 'string', + field: 'category.keyword', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + type: 'terms', + params: { + field: 'category.keyword', + orderBy: 'yAccessorId', + order: 'desc', + size: 3, + otherBucket: false, + otherBucketLabel: 'Other', + missingBucket: false, + missingBucketLabel: 'Missing', + }, }, - }, - formatHint: { - id: 'terms', params: { - id: 'string', - otherBucketLabel: 'Other', - missingBucketLabel: 'Missing', - parsedUrl: { - origin: 'http://localhost:5601', - pathname: '/jiy/app/kibana', - basePath: '/jiy', + id: 'terms', + params: { + id: 'string', + otherBucketLabel: 'Other', + missingBucketLabel: 'Missing', + parsedUrl: { + origin: 'http://localhost:5601', + pathname: '/jiy/app/kibana', + basePath: '/jiy', + }, }, }, }, @@ -154,11 +166,15 @@ const dateHistogramData: LensMultiTable = { id: 'yAccessorId', name: 'Count of records', meta: { - type: 'count', - indexPatternId: 'indexPatternId', - aggConfigParams: {}, + type: 'number', + source: 'esaggs', + index: 'indexPatternId', + sourceParams: { + indexPatternId: 'indexPatternId', + params: {}, + }, + params: { id: 'number' }, }, - formatHint: { id: 'number' }, }, ], }, @@ -181,22 +197,30 @@ const dateHistogramLayer: LayerArgs = { accessors: ['yAccessorId'], }; -const createSampleDatatableWithRows = (rows: KibanaDatatableRow[]): KibanaDatatable => ({ - type: 'kibana_datatable', +const createSampleDatatableWithRows = (rows: DatatableRow[]): Datatable => ({ + type: 'datatable', columns: [ { id: 'a', name: 'a', - formatHint: { id: 'number', params: { pattern: '0,0.000' } }, + meta: { type: 'number', params: { id: 'number', params: { pattern: '0,0.000' } } }, + }, + { + id: 'b', + name: 'b', + meta: { type: 'number', params: { id: 'number', params: { pattern: '000,0' } } }, }, - { id: 'b', name: 'b', formatHint: { id: 'number', params: { pattern: '000,0' } } }, { id: 'c', name: 'c', - formatHint: { id: 'string' }, - meta: { type: 'date-histogram', aggConfigParams: { interval: 'auto' } }, + meta: { + type: 'date', + field: 'order_date', + sourceParams: { type: 'date-histogram', params: { interval: 'auto' } }, + params: { id: 'string' }, + }, }, - { id: 'd', name: 'ColD', formatHint: { id: 'string' } }, + { id: 'd', name: 'ColD', meta: { type: 'string' } }, ], rows, }); @@ -347,12 +371,12 @@ describe('xy_expression', () => { type: 'lens_multitable', tables: { first: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, - { id: 'd', name: 'd' }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'string' } }, + { id: 'd', name: 'd', meta: { type: 'string' } }, ], rows: [ { a: 1, b: 2, c: 'I', d: 'Row 1' }, @@ -365,12 +389,12 @@ describe('xy_expression', () => { type: 'lens_multitable', tables: { first: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, - { id: 'd', name: 'd', formatHint: { id: 'custom' } }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'string' } }, + { id: 'd', name: 'd', meta: { type: 'string', params: { id: 'custom' } } }, ], rows: [ { a: 1, b: 2, c: 'I', d: 'Row 1' }, @@ -542,12 +566,12 @@ describe('xy_expression', () => { ); expect(component.find(Settings).prop('xDomain')).toMatchInlineSnapshot(` - Object { - "max": 1546491600000, - "min": 1546405200000, - "minInterval": undefined, - } - `); + Object { + "max": 1546491600000, + "min": 1546405200000, + "minInterval": undefined, + } + `); }); test('it generates correct xDomain for a layer with single value and layer with multiple value data (1-n)', () => { const data: LensMultiTable = { @@ -625,12 +649,12 @@ describe('xy_expression', () => { ); expect(component.find(Settings).prop('xDomain')).toMatchInlineSnapshot(` - Object { - "max": 1546491600000, - "min": 1546405200000, - "minInterval": undefined, - } - `); + Object { + "max": 1546491600000, + "min": 1546405200000, + "minInterval": undefined, + } + `); }); }); @@ -792,7 +816,7 @@ describe('xy_expression', () => { type: 'lens_multitable', tables: { numberLayer: { - type: 'kibana_datatable', + type: 'datatable', rows: [ { xAccessorId: 5, @@ -815,10 +839,12 @@ describe('xy_expression', () => { { id: 'xAccessorId', name: 'bytes', + meta: { type: 'number' }, }, { id: 'yAccessorId', name: 'Count of records', + meta: { type: 'number' }, }, ], }, @@ -1737,11 +1763,11 @@ describe('xy_expression', () => { type: 'lens_multitable', tables: { first: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'string' } }, ], rows: [ { a: undefined, b: 2, c: 'I', d: 'Row 1' }, @@ -1749,11 +1775,11 @@ describe('xy_expression', () => { ], }, second: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'string' } }, ], rows: [ { a: undefined, b: undefined, c: undefined }, @@ -1831,11 +1857,11 @@ describe('xy_expression', () => { type: 'lens_multitable', tables: { first: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'number' } }, ], rows: [ { a: 0, b: 2, c: 5 }, @@ -1903,11 +1929,11 @@ describe('xy_expression', () => { type: 'lens_multitable', tables: { first: { - type: 'kibana_datatable', + type: 'datatable', columns: [ - { id: 'a', name: 'a' }, - { id: 'b', name: 'b' }, - { id: 'c', name: 'c' }, + { id: 'a', name: 'a', meta: { type: 'number' } }, + { id: 'b', name: 'b', meta: { type: 'number' } }, + { id: 'c', name: 'c', meta: { type: 'string' } }, ], rows: [{ a: 1, b: 5, c: 'J' }], }, diff --git a/x-pack/plugins/lens/public/xy_visualization/expression.tsx b/x-pack/plugins/lens/public/xy_visualization/expression.tsx index dad1d31ced71f..4a2c13e1e3520 100644 --- a/x-pack/plugins/lens/public/xy_visualization/expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/expression.tsx @@ -26,7 +26,8 @@ import { ExpressionFunctionDefinition, ExpressionRenderDefinition, ExpressionValueSearchContext, - KibanaDatatable, + Datatable, + DatatableRow, } from 'src/plugins/expressions/public'; import { IconType } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -271,7 +272,7 @@ export function XYChart({ const xAxisColumn = data.tables[filteredLayers[0].layerId].columns.find( ({ id }) => id === filteredLayers[0].xAccessor ); - const xAxisFormatter = formatFactory(xAxisColumn && xAxisColumn.formatHint); + const xAxisFormatter = formatFactory(xAxisColumn && xAxisColumn.meta?.params); const layersAlreadyFormatted: Record = {}; // This is a safe formatter for the xAccessor that abstracts the knowledge of already formatted layers const safeXAccessorLabelRenderer = (value: unknown): string => @@ -330,8 +331,8 @@ export function XYChart({ // add minInterval only for single point in domain if (data.dateRange && isSingleTimestampInXDomain()) { - if (xAxisColumn?.meta?.aggConfigParams?.interval !== 'auto') - return parseInterval(xAxisColumn?.meta?.aggConfigParams?.interval)?.asMilliseconds(); + const params = xAxisColumn?.meta?.sourceParams?.params as Record; + if (params?.interval !== 'auto') return parseInterval(params?.interval)?.asMilliseconds(); const { fromDate, toDate } = data.dateRange; const duration = moment(toDate).diff(moment(fromDate)); @@ -417,8 +418,9 @@ export function XYChart({ const xAxisColumnIndex = table.columns.findIndex( (el) => el.id === filteredLayers[0].xAccessor ); + const timeFieldName = isTimeViz - ? table.columns[xAxisColumnIndex]?.meta?.aggConfigParams?.field + ? table.columns[xAxisColumnIndex]?.meta?.field : undefined; const context: LensBrushEvent['data'] = { @@ -471,8 +473,7 @@ export function XYChart({ }); } - const xAxisFieldName = table.columns.find((el) => el.id === layer.xAccessor)?.meta - ?.aggConfigParams?.field; + const xAxisFieldName = table.columns.find((el) => el.id === layer.xAccessor)?.meta?.field; const timeFieldName = xDomain && xAxisFieldName; const context: LensFilterEvent['data'] = { @@ -552,14 +553,14 @@ export function XYChart({ // what if row values are not primitive? That is the case of, for instance, Ranges // remaps them to their serialized version with the formatHint metadata // In order to do it we need to make a copy of the table as the raw one is required for more features (filters, etc...) later on - const tableConverted: KibanaDatatable = { + const tableConverted: Datatable = { ...table, - rows: table.rows.map((row) => { + rows: table.rows.map((row: DatatableRow) => { const newRow = { ...row }; for (const column of table.columns) { const record = newRow[column.id]; if (record && !isPrimitive(record)) { - newRow[column.id] = formatFactory(column.formatHint).convert(record); + newRow[column.id] = formatFactory(column.meta.params).convert(record); } } return newRow; @@ -634,7 +635,7 @@ export function XYChart({ }, }, name(d) { - const splitHint = table.columns.find((col) => col.id === splitAccessor)?.formatHint; + const splitHint = table.columns.find((col) => col.id === splitAccessor)?.meta?.params; // For multiple y series, the name of the operation is used on each, either: // * Key - Y name From 4f4abf2286fe2b517b6e83aeb65b3241ee930b77 Mon Sep 17 00:00:00 2001 From: spalger Date: Tue, 13 Oct 2020 08:06:23 -0700 Subject: [PATCH 44/85] skip flaky suite (#79389) --- .../cypress/integration/timeline_creation.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timeline_creation.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timeline_creation.spec.ts index 9f61d11b7ac0f..8ce60450671b9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timeline_creation.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timeline_creation.spec.ts @@ -45,7 +45,8 @@ import { openTimeline } from '../tasks/timelines'; import { OVERVIEW_URL } from '../urls/navigation'; -describe('Timelines', () => { +// FLAKY: https://github.com/elastic/kibana/issues/79389 +describe.skip('Timelines', () => { before(() => { cy.server(); cy.route('PATCH', '**/api/timeline').as('timeline'); From af6d2876537399ccf1138326670d9f60e7dbde6c Mon Sep 17 00:00:00 2001 From: EamonnTP Date: Tue, 13 Oct 2020 16:08:48 +0100 Subject: [PATCH 45/85] Move observability content (#79978) --- docs/infrastructure/images/infra-sysmon.png | Bin 302360 -> 0 bytes docs/infrastructure/index.asciidoc | 32 --------- docs/logs/images/logs-console.png | Bin 510715 -> 0 bytes docs/logs/index.asciidoc | 21 ------ .../alerting/alert-management.asciidoc | 4 +- docs/observability/images/apm-app.png | Bin 0 -> 465762 bytes docs/observability/images/logs-app.png | Bin 0 -> 1101522 bytes docs/observability/images/metrics-app.png | Bin 0 -> 328281 bytes docs/observability/images/uptime-app.png | Bin 0 -> 492069 bytes docs/observability/index.asciidoc | 65 ++++++++++++++++-- docs/uptime/images/uptime-overview.png | Bin 322479 -> 0 bytes docs/uptime/index.asciidoc | 19 ----- docs/user/alerting/alert-types.asciidoc | 2 +- .../alerting-getting-started.asciidoc | 8 +-- docs/user/alerting/defining-alerts.asciidoc | 2 +- docs/user/index.asciidoc | 6 -- 16 files changed, 69 insertions(+), 90 deletions(-) delete mode 100644 docs/infrastructure/images/infra-sysmon.png delete mode 100644 docs/infrastructure/index.asciidoc delete mode 100644 docs/logs/images/logs-console.png delete mode 100644 docs/logs/index.asciidoc create mode 100644 docs/observability/images/apm-app.png create mode 100644 docs/observability/images/logs-app.png create mode 100644 docs/observability/images/metrics-app.png create mode 100644 docs/observability/images/uptime-app.png delete mode 100644 docs/uptime/images/uptime-overview.png delete mode 100644 docs/uptime/index.asciidoc diff --git a/docs/infrastructure/images/infra-sysmon.png b/docs/infrastructure/images/infra-sysmon.png deleted file mode 100644 index dd653bb046f4511d0c5ad781dd062f0589e4e30e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302360 zcmeFZcUTkM);10(f}()Zly0L6Nbf~aIz;I`NHtWcp#~69sX>w6RC*Wb9Tf;23BC7T z0t6C5Nq)m~&Uw%KzTfqH-}C(bK3vz3VKRI6%$~K^y4QWLP1rLnuDS0Z~+ZrmCpO{>;tA7UF0_M5GcHXFz7C(@CFhqOJNe z_*vGQnJ3pTlBit%@{~G;=e?Q=$>sa)Z$4Wp$Lqb?zH?h*nd7T@PkE_`@x!5O0O$lUstx;c(~7(<<@ zTPDO~WCb@Sr!_ScZh14N*g+NXc8p|!90GHU)X#|H3!8g%)s9?BQ@cYQ8EwX{{f5(C z(qSo53p7QKa!b)v!=Q2Ftro z%`Ge1FO~DryIYYtE_GehJH=3!KSg#tyCxt1fe)_od!qXa?FF2rjpbzl{fNRVZK}_c zk1Zxi{XI`}sKvvxQkRHXKUkXfDDXdiZdk(sEz-QFIkFNl9ZUC?<0S&qvA{!C3HWb~aO!xD0{yf6UI&@DpSz@op6u;)JDdT+_lL$b%?AwJy)Ex`J>j%+G>-(2XzpBpb~Tzp4;!vM!>li~CU8?mq3U^rEG@q9*v| z&9l^I*8I(aP1%mG1#1b11FgxThI%^|{iFC=@Q@Mt>;TxrlH!}}821*J*Cpv7QDS

DNnLvJ?>F^ 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 z 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

KE&GSp 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

c^n{(V3^GCW(Dw2mFG0?3cSg$eJLVr=*W6* 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 T*y_gt{JV40@J7jXo8bQeiwkP^ diff --git a/docs/infrastructure/index.asciidoc b/docs/infrastructure/index.asciidoc deleted file mode 100644 index 81a3022436a7e..0000000000000 --- a/docs/infrastructure/index.asciidoc +++ /dev/null @@ -1,32 +0,0 @@ -[chapter] -[role="xpack"] -[[xpack-infra]] -= Metrics - -The {metrics-app} in {kib} enables you to monitor your infrastructure metrics and identify problems in real time. -You start with a visual summary of your infrastructure where you can view basic metrics for common servers, containers, and services. -Then you can drill down to view more detailed metrics or other information for that component. - -You can: - -* View your infrastructure metrics by hosts, Kubernetes pods, or Docker containers. -You can group and filter the data in various ways to help you identify the items that interest you. - -* View current and historic values for metrics such as CPU usage, memory usage, and network traffic for each component. -The available metrics depend on the kind of component being inspected. - -* Use *Metrics Explorer* to group and visualize multiple customizable metrics for one or more components in a graphical format. -You can optionally save these views and add them to {kibana-ref}/dashboard.html[dashboards]. - -* Seamlessly switch to view the corresponding logs, application traces or uptime information for a component. - -* Create alerts based on metric thresholds for one or more components. - -[role="screenshot"] -image::infrastructure/images/infra-sysmon.png[Infrastructure Overview in Kibana] - -[float] -=== Get started - -To get started with Metrics, refer to {metrics-guide}/install-metrics-monitoring.html[Install Metrics]. - diff --git a/docs/logs/images/logs-console.png b/docs/logs/images/logs-console.png deleted file mode 100644 index ddd3346475da6621af538092c24b6fde91832778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 510715 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

Z>(T8?^Z0CVHMJY7AHhGW62Dq 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%0D`fHXmY@$1Z&Npdi&SKQtzFH-?JwS9 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

mlcUTG+pcc&+2=ZETBLtI{ch7f^IIrGP~ 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 diff --git a/docs/logs/index.asciidoc b/docs/logs/index.asciidoc deleted file mode 100644 index 45d4321f40556..0000000000000 --- a/docs/logs/index.asciidoc +++ /dev/null @@ -1,21 +0,0 @@ -[chapter] -[role="xpack"] -[[xpack-logs]] -= Logs - -The Logs app in Kibana enables you to explore logs for common servers, containers, and services. - -The Logs app has a compact, console-like display that you can customize. -You can filter the logs by various fields, start and stop live streaming, and highlight text of interest. - -You can open the Logs app from the *Logs* tab in Kibana. -You can also open the Logs app directly from a component in the Metrics app. -In this case, you will only see the logs for the selected component. - -[role="screenshot"] -image::logs/images/logs-console.png[Logs Console in Kibana] - -[float] -=== Get started - -To get started with Elastic Logs, refer to {logs-guide}/install-logs-monitoring.html[Install Logs]. diff --git a/docs/management/alerting/alert-management.asciidoc b/docs/management/alerting/alert-management.asciidoc index 73cf40c4d7c40..f348812550978 100644 --- a/docs/management/alerting/alert-management.asciidoc +++ b/docs/management/alerting/alert-management.asciidoc @@ -4,7 +4,7 @@ beta[] -The *Alerts* tab provides a cross-app view of alerting. Different {kib} apps like <>, <>, <>, and <> can offer their own alerts, and the *Alerts* tab provides a central place to: +The *Alerts* tab provides a cross-app view of alerting. Different {kib} apps like <>, <>, <>, and <> can offer their own alerts, and the *Alerts* tab provides a central place to: * <> alerts * <> including enabling/disabling, muting/unmuting, and deleting @@ -39,7 +39,7 @@ image::images/alerts-filter-by-action-type.png[Filtering the alert list by type [[create-edit-alerts]] ==== Creating and editing alerts -Many alerts must be created within the context of a {kib} app like <>, <>, or <>, but others are generic. Generic alert types can be created in the *Alerts* management UI by clicking the *Create* button. This will launch a flyout that guides you through selecting an alert type and configuring it's properties. Refer to <> for details on what types of alerts are available and how to configure them. +Many alerts must be created within the context of a {kib} app like <>, <>, or <>, but others are generic. Generic alert types can be created in the *Alerts* management UI by clicking the *Create* button. This will launch a flyout that guides you through selecting an alert type and configuring it's properties. Refer to <> for details on what types of alerts are available and how to configure them. After an alert is created, you can re-open the flyout and change an alerts properties by clicking the *Edit* button shown on each row of the alert listing. diff --git a/docs/observability/images/apm-app.png b/docs/observability/images/apm-app.png new file mode 100644 index 0000000000000000000000000000000000000000..acbaa70c7f2f16c302ef2d9779546c90ddd254c6 GIT binary patch literal 465762 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

!e^~EDAJEk|u}mp_Y_wUL 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 jo3w+^*I)pI>eW4g<@#Y$WC6=l6q| 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

dDR*0TgVZ4>937Cks9zT8}~BH2DJEPOXZ&M#2^ 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

!bcPSypKbSav8ulA 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